Index: chrome/browser/apps/ephemeral_app_browsertest.cc |
diff --git a/chrome/browser/apps/ephemeral_app_browsertest.cc b/chrome/browser/apps/ephemeral_app_browsertest.cc |
deleted file mode 100644 |
index 2204ba60eb96099aa16e5293300518964a823e6e..0000000000000000000000000000000000000000 |
--- a/chrome/browser/apps/ephemeral_app_browsertest.cc |
+++ /dev/null |
@@ -1,1051 +0,0 @@ |
-// Copyright 2014 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/apps/ephemeral_app_browsertest.h" |
- |
-#include <vector> |
- |
-#include "apps/app_restore_service.h" |
-#include "apps/saved_files_service.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/scoped_observer.h" |
-#include "base/stl_util.h" |
-#include "chrome/browser/apps/app_browsertest_util.h" |
-#include "chrome/browser/apps/ephemeral_app_service.h" |
-#include "chrome/browser/extensions/api/file_system/file_system_api.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_sync_data.h" |
-#include "chrome/browser/extensions/extension_sync_service.h" |
-#include "chrome/browser/extensions/extension_util.h" |
-#include "chrome/browser/notifications/notifier_state_tracker.h" |
-#include "chrome/browser/notifications/notifier_state_tracker_factory.h" |
-#include "content/public/browser/power_save_blocker.h" |
-#include "content/public/test/browser_test.h" |
-#include "content/public/test/test_utils.h" |
-#include "extensions/browser/api/power/power_api.h" |
-#include "extensions/browser/app_sorting.h" |
-#include "extensions/browser/event_router.h" |
-#include "extensions/browser/extension_prefs.h" |
-#include "extensions/browser/extension_registry.h" |
-#include "extensions/browser/extension_registry_observer.h" |
-#include "extensions/browser/extension_system.h" |
-#include "extensions/browser/extension_util.h" |
-#include "extensions/browser/process_manager.h" |
-#include "extensions/browser/test_extension_registry_observer.h" |
-#include "extensions/browser/uninstall_reason.h" |
-#include "extensions/common/api/alarms.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/test/extension_test_message_listener.h" |
-#include "extensions/test/result_catcher.h" |
-#include "sync/api/fake_sync_change_processor.h" |
-#include "sync/api/sync_change_processor_wrapper_for_test.h" |
-#include "sync/api/sync_error_factory_mock.h" |
-#include "ui/app_list/app_list_switches.h" |
-#include "ui/message_center/message_center.h" |
-#include "ui/message_center/notifier_settings.h" |
- |
-using extensions::AppSorting; |
-using extensions::Event; |
-using extensions::EventRouter; |
-using extensions::Extension; |
-using extensions::ExtensionPrefs; |
-using extensions::ExtensionRegistry; |
-using extensions::ExtensionRegistryObserver; |
-using extensions::ExtensionSyncData; |
-using extensions::ExtensionSystem; |
-using extensions::Manifest; |
-using extensions::ResultCatcher; |
- |
-namespace { |
- |
-namespace alarms = extensions::api::alarms; |
- |
-const char kPowerTestApp[] = "ephemeral_apps/power"; |
- |
-// Enabling sync causes these tests to be flaky on Windows. Disable sync so that |
-// everything else can be tested. See crbug.com/401028 |
-#if defined(OS_WIN) |
-const bool kEnableSync = false; |
-#else |
-const bool kEnableSync = true; |
-#endif |
- |
-typedef std::vector<message_center::Notifier*> NotifierList; |
- |
-bool IsNotifierInList(const message_center::NotifierId& notifier_id, |
- const NotifierList& notifiers) { |
- for (NotifierList::const_iterator it = notifiers.begin(); |
- it != notifiers.end(); ++it) { |
- const message_center::Notifier* notifier = *it; |
- if (notifier->notifier_id == notifier_id) |
- return true; |
- } |
- |
- return false; |
-} |
- |
-// Saves some parameters from the extension installed notification in order |
-// to verify them in tests. |
-class InstallObserver : public ExtensionRegistryObserver { |
- public: |
- struct InstallParameters { |
- std::string id; |
- bool is_update; |
- bool from_ephemeral; |
- |
- InstallParameters( |
- const std::string& id, |
- bool is_update, |
- bool from_ephemeral) |
- : id(id), is_update(is_update), from_ephemeral(from_ephemeral) {} |
- }; |
- |
- explicit InstallObserver(Profile* profile) : registry_observer_(this) { |
- registry_observer_.Add(ExtensionRegistry::Get(profile)); |
- } |
- |
- ~InstallObserver() override {} |
- |
- const InstallParameters& Last() { |
- CHECK(!install_params_.empty()); |
- return install_params_.back(); |
- } |
- |
- private: |
- void OnExtensionWillBeInstalled(content::BrowserContext* browser_context, |
- const Extension* extension, |
- bool is_update, |
- bool from_ephemeral, |
- const std::string& old_name) override { |
- install_params_.push_back( |
- InstallParameters(extension->id(), is_update, from_ephemeral)); |
- } |
- |
- std::vector<InstallParameters> install_params_; |
- ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> |
- registry_observer_; |
-}; |
- |
-// Instead of actually changing the system power settings, tests will just |
-// issue requests to this mock. |
-class PowerSettingsMock { |
- public: |
- PowerSettingsMock() : keep_awake_count_(0) {} |
- |
- void request_keep_awake() { ++keep_awake_count_; } |
- |
- void release_keep_awake() { |
- --keep_awake_count_; |
- ASSERT_GE(keep_awake_count_, 0); |
- } |
- |
- int keep_awake_count() const { return keep_awake_count_; } |
- |
- private: |
- int keep_awake_count_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PowerSettingsMock); |
-}; |
- |
-// Stub implementation of content::PowerSaveBlocker that updates the |
-// PowerSettingsMock. |
-class PowerSaveBlockerStub : public content::PowerSaveBlocker { |
- public: |
- explicit PowerSaveBlockerStub(PowerSettingsMock* power_settings) |
- : power_settings_(power_settings) { |
- power_settings_->request_keep_awake(); |
- } |
- |
- ~PowerSaveBlockerStub() override { power_settings_->release_keep_awake(); } |
- |
- static scoped_ptr<PowerSaveBlocker> Create(PowerSettingsMock* power_settings, |
- PowerSaveBlockerType type, |
- Reason reason, |
- const std::string& description) { |
- return scoped_ptr<PowerSaveBlocker>( |
- new PowerSaveBlockerStub(power_settings)); |
- } |
- |
- private: |
- PowerSettingsMock* power_settings_; // Not owned. |
- |
- DISALLOW_COPY_AND_ASSIGN(PowerSaveBlockerStub); |
-}; |
- |
-} // namespace |
- |
- |
-// EphemeralAppTestBase: |
- |
-const char EphemeralAppTestBase::kMessagingReceiverApp[] = |
- "ephemeral_apps/messaging_receiver"; |
-const char EphemeralAppTestBase::kMessagingReceiverAppV2[] = |
- "ephemeral_apps/messaging_receiver2"; |
-const char EphemeralAppTestBase::kDispatchEventTestApp[] = |
- "ephemeral_apps/dispatch_event"; |
-const char EphemeralAppTestBase::kNotificationsTestApp[] = |
- "ephemeral_apps/notification_settings"; |
-const char EphemeralAppTestBase::kFileSystemTestApp[] = |
- "ephemeral_apps/filesystem_retain_entries"; |
- |
-EphemeralAppTestBase::EphemeralAppTestBase() {} |
- |
-EphemeralAppTestBase::~EphemeralAppTestBase() {} |
- |
-void EphemeralAppTestBase::SetUpCommandLine(base::CommandLine* command_line) { |
- // Skip PlatformAppBrowserTest, which sets different values for the switches |
- // below. |
- ExtensionBrowserTest::SetUpCommandLine(command_line); |
- |
- // Make event pages get suspended immediately. |
- extensions::ProcessManager::SetEventPageIdleTimeForTesting(1); |
- extensions::ProcessManager::SetEventPageSuspendingTimeForTesting(1); |
- |
- // Enable ephemeral apps, which are gated by the experimental app launcher |
- // flag. |
- command_line->AppendSwitch(app_list::switches::kEnableExperimentalAppList); |
-} |
- |
-void EphemeralAppTestBase::SetUpOnMainThread() { |
- PlatformAppBrowserTest::SetUpOnMainThread(); |
- |
- // Disable ephemeral apps immediately after they stop running in tests. |
- EphemeralAppService::Get(profile())->set_disable_delay_for_test(0); |
-} |
- |
-base::FilePath EphemeralAppTestBase::GetTestPath(const char* test_path) { |
- return test_data_dir_.AppendASCII("platform_apps").AppendASCII(test_path); |
-} |
- |
-const Extension* EphemeralAppTestBase::InstallEphemeralApp( |
- const char* test_path, Manifest::Location manifest_location) { |
- const Extension* extension = InstallEphemeralAppWithSourceAndFlags( |
- GetTestPath(test_path), 1, manifest_location, Extension::NO_FLAGS); |
- EXPECT_TRUE(extension); |
- if (extension) |
- EXPECT_TRUE(extensions::util::IsEphemeralApp(extension->id(), profile())); |
- return extension; |
-} |
- |
-const Extension* EphemeralAppTestBase::InstallEphemeralApp( |
- const char* test_path) { |
- return InstallEphemeralApp(test_path, Manifest::INTERNAL); |
-} |
- |
-const Extension* EphemeralAppTestBase::InstallAndLaunchEphemeralApp( |
- const char* test_path) { |
- ExtensionTestMessageListener launched_listener("launched", false); |
- const Extension* extension = InstallEphemeralApp(test_path); |
- EXPECT_TRUE(extension); |
- if (!extension) |
- return NULL; |
- |
- LaunchPlatformApp(extension); |
- bool wait_result = launched_listener.WaitUntilSatisfied(); |
- EXPECT_TRUE(wait_result); |
- if (!wait_result) |
- return NULL; |
- |
- return extension; |
-} |
- |
-const Extension* EphemeralAppTestBase::UpdateEphemeralApp( |
- const std::string& app_id, |
- const base::FilePath& test_dir, |
- const base::FilePath& pem_path) { |
- // Pack a new version of the app. |
- base::ScopedTempDir temp_dir; |
- EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
- |
- base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); |
- if (!base::DeleteFile(crx_path, false)) { |
- ADD_FAILURE() << "Failed to delete existing crx: " << crx_path.value(); |
- return NULL; |
- } |
- |
- base::FilePath app_v2_path = PackExtensionWithOptions( |
- test_dir, crx_path, pem_path, base::FilePath()); |
- EXPECT_FALSE(app_v2_path.empty()); |
- |
- // Update the ephemeral app and wait for the update to finish. |
- extensions::CrxInstaller* crx_installer = NULL; |
- content::WindowedNotificationObserver windowed_observer( |
- extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
- content::Source<extensions::CrxInstaller>(crx_installer)); |
- ExtensionService* service = |
- ExtensionSystem::Get(profile())->extension_service(); |
- EXPECT_TRUE(service->UpdateExtension( |
- extensions::CRXFileInfo(app_id, app_v2_path), true, &crx_installer)); |
- windowed_observer.Wait(); |
- |
- return ExtensionRegistry::Get(profile()) |
- ->GetExtensionById(app_id, ExtensionRegistry::EVERYTHING); |
-} |
- |
-void EphemeralAppTestBase::PromoteEphemeralApp( |
- const extensions::Extension* app) { |
- ExtensionService* extension_service = |
- ExtensionSystem::Get(profile())->extension_service(); |
- ASSERT_TRUE(extension_service); |
- extension_service->PromoteEphemeralApp(app, false); |
-} |
- |
-void EphemeralAppTestBase::DisableEphemeralApp( |
- const Extension* app, |
- Extension::DisableReason disable_reason) { |
- ExtensionSystem::Get(profile())->extension_service()->DisableExtension( |
- app->id(), disable_reason); |
- |
- ASSERT_TRUE(ExtensionRegistry::Get(profile())->disabled_extensions().Contains( |
- app->id())); |
-} |
- |
-void EphemeralAppTestBase::CloseApp(const std::string& app_id) { |
- EXPECT_EQ(1U, GetAppWindowCountForApp(app_id)); |
- extensions::AppWindow* app_window = GetFirstAppWindowForApp(app_id); |
- ASSERT_TRUE(app_window); |
- CloseAppWindow(app_window); |
-} |
- |
-void EphemeralAppTestBase::CloseAppWaitForUnload(const std::string& app_id) { |
- // Ephemeral apps are unloaded from extension system after they stop running. |
- extensions::TestExtensionRegistryObserver observer( |
- ExtensionRegistry::Get(profile()), app_id); |
- CloseApp(app_id); |
- observer.WaitForExtensionUnloaded(); |
-} |
- |
-void EphemeralAppTestBase::EvictApp(const std::string& app_id) { |
- // Uninstall the app, which is what happens when ephemeral apps get evicted |
- // from the cache. |
- extensions::TestExtensionRegistryObserver observer( |
- ExtensionRegistry::Get(profile()), app_id); |
- |
- ExtensionService* service = |
- ExtensionSystem::Get(profile())->extension_service(); |
- ASSERT_TRUE(service); |
- service->UninstallExtension( |
- app_id, |
- extensions::UNINSTALL_REASON_ORPHANED_EPHEMERAL_EXTENSION, |
- base::Bind(&base::DoNothing), |
- NULL); |
- |
- observer.WaitForExtensionUninstalled(); |
-} |
- |
-// EphemeralAppBrowserTest: |
- |
-class EphemeralAppBrowserTest : public EphemeralAppTestBase { |
- protected: |
- bool LaunchAppAndRunTest(const Extension* app, const char* test_name) { |
- // Ephemeral apps are unloaded after they are closed. Ensure they are |
- // enabled before launch. |
- ExtensionService* service = |
- ExtensionSystem::Get(profile())->extension_service(); |
- service->EnableExtension(app->id()); |
- |
- ExtensionTestMessageListener launched_listener("launched", true); |
- LaunchPlatformApp(app); |
- if (!launched_listener.WaitUntilSatisfied()) { |
- message_ = "Failed to receive launched message from test"; |
- return false; |
- } |
- |
- ResultCatcher catcher; |
- launched_listener.Reply(test_name); |
- |
- bool result = catcher.GetNextResult(); |
- message_ = catcher.message(); |
- |
- CloseAppWaitForUnload(app->id()); |
- return result; |
- } |
- |
- // Verify that the event page of the app has not been loaded. |
- void VerifyAppNotLoaded(const std::string& app_id) { |
- EXPECT_FALSE(extensions::ProcessManager::Get(profile()) |
- ->GetBackgroundHostForExtension(app_id)); |
- } |
- |
- // Verify properties of ephemeral apps. |
- void VerifyEphemeralApp(const std::string& app_id) { |
- EXPECT_TRUE(extensions::util::IsEphemeralApp(app_id, profile())); |
- |
- // Ephemeral apps should not be synced. |
- scoped_ptr<ExtensionSyncData> sync_change = GetLastSyncChangeForApp(app_id); |
- EXPECT_FALSE(sync_change.get()); |
- |
- // Ephemeral apps should not be assigned ordinals. |
- AppSorting* app_sorting = ExtensionSystem::Get(profile())->app_sorting(); |
- EXPECT_FALSE(app_sorting->GetAppLaunchOrdinal(app_id).IsValid()); |
- EXPECT_FALSE(app_sorting->GetPageOrdinal(app_id).IsValid()); |
- } |
- |
- // Verify that after ephemeral apps stop running, they reside in extension |
- // system in a disabled and unloaded state. |
- void VerifyInactiveEphemeralApp(const std::string& app_id) { |
- EXPECT_TRUE( |
- ExtensionRegistry::Get(profile())->disabled_extensions().Contains( |
- app_id)); |
- |
- ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
- EXPECT_TRUE(prefs->IsExtensionDisabled(app_id)); |
- EXPECT_NE(0, |
- prefs->GetDisableReasons(app_id) & |
- Extension::DISABLE_INACTIVE_EPHEMERAL_APP); |
- } |
- |
- // Verify the state of an app that has been promoted from an ephemeral to a |
- // fully installed app. |
- void VerifyPromotedApp(const std::string& app_id, |
- ExtensionRegistry::IncludeFlag expected_set) { |
- const Extension* app = ExtensionRegistry::Get(profile()) |
- ->GetExtensionById(app_id, expected_set); |
- ASSERT_TRUE(app) << "App not found in expected set: " << expected_set; |
- |
- // The app should not be ephemeral. |
- ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
- ASSERT_TRUE(prefs); |
- EXPECT_FALSE(prefs->IsEphemeralApp(app_id)); |
- EXPECT_EQ(0, |
- prefs->GetDisableReasons(app_id) & |
- Extension::DISABLE_INACTIVE_EPHEMERAL_APP); |
- |
- // Check sort ordinals. |
- AppSorting* app_sorting = ExtensionSystem::Get(profile())->app_sorting(); |
- EXPECT_TRUE(app_sorting->GetAppLaunchOrdinal(app_id).IsValid()); |
- EXPECT_TRUE(app_sorting->GetPageOrdinal(app_id).IsValid()); |
- } |
- |
- // Dispatch a fake alarm event to the app. |
- void DispatchAlarmEvent(EventRouter* event_router, |
- const std::string& app_id) { |
- alarms::Alarm dummy_alarm; |
- dummy_alarm.name = "test_alarm"; |
- |
- scoped_ptr<base::ListValue> args(new base::ListValue()); |
- args->Append(dummy_alarm.ToValue().release()); |
- scoped_ptr<Event> event(new Event(extensions::events::ALARMS_ON_ALARM, |
- alarms::OnAlarm::kEventName, |
- args.Pass())); |
- |
- event_router->DispatchEventToExtension(app_id, event.Pass()); |
- } |
- |
- // Simulates the scenario where an app is installed, via the normal |
- // installation route, on top of an ephemeral app. This can occur due to race |
- // conditions. |
- const Extension* ReplaceEphemeralApp(const std::string& app_id, |
- const char* test_path, |
- int expected_enabled_change) { |
- return UpdateExtensionWaitForIdle( |
- app_id, GetTestPath(test_path), expected_enabled_change); |
- } |
- |
- void PromoteEphemeralAppAndVerify( |
- const Extension* app, |
- ExtensionRegistry::IncludeFlag expected_set, |
- bool expect_sync_enabled) { |
- ASSERT_TRUE(app); |
- |
- // Ephemeral apps should not be synced. |
- scoped_ptr<ExtensionSyncData> sync_change = |
- GetLastSyncChangeForApp(app->id()); |
- EXPECT_FALSE(sync_change.get()); |
- |
- // Promote the app to a regular installed app. |
- InstallObserver installed_observer(profile()); |
- PromoteEphemeralApp(app); |
- VerifyPromotedApp(app->id(), expected_set); |
- |
- // Check the notification parameters. |
- const InstallObserver::InstallParameters& params = |
- installed_observer.Last(); |
- EXPECT_EQ(app->id(), params.id); |
- EXPECT_TRUE(params.is_update); |
- EXPECT_TRUE(params.from_ephemeral); |
- |
- // The installation should now be synced. |
- sync_change = GetLastSyncChangeForApp(app->id()); |
- VerifySyncChange(sync_change.get(), expect_sync_enabled); |
- } |
- |
- void PromoteEphemeralAppAndVerify( |
- const Extension* app, |
- ExtensionRegistry::IncludeFlag expected_set) { |
- PromoteEphemeralAppAndVerify(app, expected_set, |
- expected_set == ExtensionRegistry::ENABLED); |
- } |
- |
- void PromoteEphemeralAppFromSyncAndVerify( |
- const Extension* app, |
- bool enable_from_sync, |
- ExtensionRegistry::IncludeFlag expected_set) { |
- ASSERT_TRUE(app); |
- |
- // Simulate an install from sync. |
- int disable_reasons = enable_from_sync ? 0 : Extension::DISABLE_USER_ACTION; |
- const syncer::StringOrdinal kAppLaunchOrdinal("x"); |
- const syncer::StringOrdinal kPageOrdinal("y"); |
- ExtensionSyncData app_sync_data( |
- *app, |
- enable_from_sync, |
- disable_reasons, |
- false /* incognito enabled */, |
- false /* remote install */, |
- extensions::ExtensionSyncData::BOOLEAN_UNSET, |
- kAppLaunchOrdinal, |
- kPageOrdinal, |
- extensions::LAUNCH_TYPE_REGULAR); |
- |
- std::string app_id = app->id(); |
- app = NULL; |
- |
- ExtensionSyncService::Get(profile())->ProcessSyncChanges( |
- FROM_HERE, |
- syncer::SyncChangeList( |
- 1, app_sync_data.GetSyncChange(syncer::SyncChange::ACTION_ADD))); |
- |
- // Verify the installation. |
- VerifyPromotedApp(app_id, expected_set); |
- |
- // The sort ordinals from sync should not be overridden. |
- AppSorting* app_sorting = ExtensionSystem::Get(profile())->app_sorting(); |
- EXPECT_TRUE( |
- app_sorting->GetAppLaunchOrdinal(app_id).Equals(kAppLaunchOrdinal)); |
- EXPECT_TRUE(app_sorting->GetPageOrdinal(app_id).Equals(kPageOrdinal)); |
- } |
- |
- void InitSyncService() { |
- if (!kEnableSync) |
- return; |
- |
- ExtensionSyncService* sync_service = ExtensionSyncService::Get(profile()); |
- sync_service->MergeDataAndStartSyncing( |
- syncer::APPS, |
- syncer::SyncDataList(), |
- scoped_ptr<syncer::SyncChangeProcessor>( |
- new syncer::SyncChangeProcessorWrapperForTest( |
- &mock_sync_processor_)), |
- scoped_ptr<syncer::SyncErrorFactory>( |
- new syncer::SyncErrorFactoryMock())); |
- } |
- |
- scoped_ptr<ExtensionSyncData> GetLastSyncChangeForApp(const std::string& id) { |
- scoped_ptr<ExtensionSyncData> sync_data; |
- for (syncer::SyncChangeList::iterator it = |
- mock_sync_processor_.changes().begin(); |
- it != mock_sync_processor_.changes().end(); ++it) { |
- scoped_ptr<ExtensionSyncData> data( |
- ExtensionSyncData::CreateFromSyncChange(*it)); |
- if (data.get() && data->id() == id) |
- sync_data.reset(data.release()); |
- } |
- |
- return sync_data.Pass(); |
- } |
- |
- void VerifySyncChange(const ExtensionSyncData* sync_change, |
- bool expect_enabled) { |
- if (!kEnableSync) |
- return; |
- |
- ASSERT_TRUE(sync_change); |
- EXPECT_TRUE(sync_change->page_ordinal().IsValid()); |
- EXPECT_TRUE(sync_change->app_launch_ordinal().IsValid()); |
- EXPECT_FALSE(sync_change->uninstalled()); |
- EXPECT_EQ(expect_enabled, sync_change->enabled()); |
- } |
- |
- void TestInstallEvent(bool close_app) { |
- ExtensionTestMessageListener first_msg_listener(false); |
- const Extension* app = InstallAndLaunchEphemeralApp(kDispatchEventTestApp); |
- ASSERT_TRUE(app); |
- |
- // When an ephemeral app is first added, it should not receive the |
- // onInstalled event, hence the first message received from the test should |
- // be "launched" and not "installed". |
- ASSERT_TRUE(first_msg_listener.WaitUntilSatisfied()); |
- EXPECT_EQ(std::string("launched"), first_msg_listener.message()); |
- |
- if (close_app) |
- CloseAppWaitForUnload(app->id()); |
- |
- // When installed permanently, the app should receive the onInstalled event. |
- ExtensionTestMessageListener install_listener("installed", false); |
- PromoteEphemeralApp(app); |
- ASSERT_TRUE(install_listener.WaitUntilSatisfied()); |
- } |
- |
- private: |
- syncer::FakeSyncChangeProcessor mock_sync_processor_; |
-}; |
- |
-// Verify that ephemeral apps can be launched and receive system events when |
-// they are running. Once they are inactive they should not receive system |
-// events. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, EventDispatchWhenLaunched) { |
- const Extension* extension = |
- InstallAndLaunchEphemeralApp(kDispatchEventTestApp); |
- ASSERT_TRUE(extension); |
- |
- // Send a fake alarm event to the app and verify that a response is |
- // received. |
- EventRouter* event_router = EventRouter::Get(profile()); |
- ASSERT_TRUE(event_router); |
- |
- ExtensionTestMessageListener alarm_received_listener("alarm_received", false); |
- DispatchAlarmEvent(event_router, extension->id()); |
- ASSERT_TRUE(alarm_received_listener.WaitUntilSatisfied()); |
- |
- CloseAppWaitForUnload(extension->id()); |
- |
- // Dispatch the alarm event again and verify that the event page did not get |
- // loaded for the app. |
- DispatchAlarmEvent(event_router, extension->id()); |
- VerifyAppNotLoaded(extension->id()); |
-} |
- |
-// Verify that ephemeral apps will receive messages while they are running. |
-// Flaky test: crbug.com/394426 |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- DISABLED_ReceiveMessagesWhenLaunched) { |
- const Extension* receiver = |
- InstallAndLaunchEphemeralApp(kMessagingReceiverApp); |
- ASSERT_TRUE(receiver); |
- |
- // Verify that messages are received while the app is running. |
- ResultCatcher result_catcher; |
- LoadAndLaunchPlatformApp("ephemeral_apps/messaging_sender_success", |
- "Launched"); |
- EXPECT_TRUE(result_catcher.GetNextResult()); |
- |
- CloseAppWaitForUnload(receiver->id()); |
- |
- // Verify that messages are not received while the app is inactive. |
- LoadAndLaunchPlatformApp("ephemeral_apps/messaging_sender_fail", "Launched"); |
- EXPECT_TRUE(result_catcher.GetNextResult()); |
-} |
- |
-// Verifies that the chrome.runtime.onInstalled() event is received by a running |
-// ephemeral app only when it is promoted. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- InstallEventReceivedWhileRunning) { |
- TestInstallEvent(false /* close app */); |
-} |
- |
-// Verifies that when an idle ephemeral app is promoted, it will be loaded to |
-// receive the chrome.runtime.onInstalled() event. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, InstallEventReceivedWhileIdle) { |
- TestInstallEvent(true /* close app */); |
-} |
- |
-// Verifies that the chrome.runtime.onRestarted() event is received by an |
-// ephemeral app. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, RestartEventReceived) { |
- const Extension* app = InstallAndLaunchEphemeralApp(kDispatchEventTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- |
- // Fake ephemeral app running before restart. |
- ExtensionSystem::Get(profile())->extension_service()->EnableExtension( |
- app->id()); |
- ASSERT_TRUE(ExtensionRegistry::Get(profile())->enabled_extensions().Contains( |
- app->id())); |
- ExtensionPrefs::Get(profile())->SetExtensionRunning(app->id(), true); |
- |
- ExtensionTestMessageListener restart_listener("restarted", false); |
- apps::AppRestoreService::Get(profile())->HandleStartup(true); |
- EXPECT_TRUE(restart_listener.WaitUntilSatisfied()); |
-} |
- |
-// Verify that an updated ephemeral app will still have its ephemeral flag |
-// enabled. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, UpdateEphemeralApp) { |
- InitSyncService(); |
- |
- const Extension* app_v1 = InstallAndLaunchEphemeralApp(kMessagingReceiverApp); |
- ASSERT_TRUE(app_v1); |
- VerifyEphemeralApp(app_v1->id()); |
- CloseAppWaitForUnload(app_v1->id()); |
- VerifyInactiveEphemeralApp(app_v1->id()); |
- |
- std::string app_id = app_v1->id(); |
- base::Version app_original_version = *app_v1->version(); |
- |
- // Update to version 2 of the app. |
- app_v1 = NULL; // The extension object will be destroyed during update. |
- InstallObserver installed_observer(profile()); |
- const Extension* app_v2 = |
- UpdateEphemeralApp(app_id, |
- GetTestPath(kMessagingReceiverAppV2), |
- GetTestPath(kMessagingReceiverApp) |
- .ReplaceExtension(FILE_PATH_LITERAL(".pem"))); |
- |
- // Check the notification parameters. |
- const InstallObserver::InstallParameters& params = installed_observer.Last(); |
- EXPECT_EQ(app_id, params.id); |
- EXPECT_TRUE(params.is_update); |
- EXPECT_FALSE(params.from_ephemeral); |
- |
- // The ephemeral flag should still be set. |
- ASSERT_TRUE(app_v2); |
- EXPECT_GT(app_v2->version()->CompareTo(app_original_version), 0); |
- VerifyEphemeralApp(app_id); |
- |
- // The app should still be disabled in extension system. |
- VerifyInactiveEphemeralApp(app_id); |
-} |
- |
-// Verify that if notifications have been disabled for an ephemeral app, it will |
-// remain disabled even after being evicted from the cache. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, StickyNotificationSettings) { |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- |
- // Disable notifications for this app. |
- NotifierStateTracker* notifier_state_tracker = |
- NotifierStateTrackerFactory::GetForProfile(profile()); |
- ASSERT_TRUE(notifier_state_tracker); |
- |
- message_center::NotifierId notifier_id( |
- message_center::NotifierId::APPLICATION, app->id()); |
- EXPECT_TRUE(notifier_state_tracker->IsNotifierEnabled(notifier_id)); |
- notifier_state_tracker->SetNotifierEnabled(notifier_id, false); |
- EXPECT_FALSE(notifier_state_tracker->IsNotifierEnabled(notifier_id)); |
- |
- // Remove the app. |
- CloseAppWaitForUnload(app->id()); |
- EvictApp(app->id()); |
- |
- // Reinstall the ephemeral app and verify that notifications remain disabled. |
- app = InstallEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- message_center::NotifierId reinstalled_notifier_id( |
- message_center::NotifierId::APPLICATION, app->id()); |
- EXPECT_FALSE(notifier_state_tracker->IsNotifierEnabled( |
- reinstalled_notifier_id)); |
-} |
- |
-// Verify that only running ephemeral apps will appear in the Notification |
-// Settings UI. Inactive, cached ephemeral apps should not appear. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- IncludeRunningEphemeralAppsInNotifiers) { |
- message_center::NotifierSettingsProvider* settings_provider = |
- message_center::MessageCenter::Get()->GetNotifierSettingsProvider(); |
- DCHECK(settings_provider); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- message_center::NotifierId notifier_id( |
- message_center::NotifierId::APPLICATION, app->id()); |
- |
- // Since the ephemeral app is running, it should be included in the list |
- // of notifiers to show in the UI. |
- NotifierList notifiers; |
- STLElementDeleter<NotifierList> notifier_deleter(¬ifiers); |
- |
- settings_provider->GetNotifierList(¬ifiers); |
- EXPECT_TRUE(IsNotifierInList(notifier_id, notifiers)); |
- STLDeleteElements(¬ifiers); |
- |
- // Close the ephemeral app. |
- CloseAppWaitForUnload(app->id()); |
- |
- // Inactive ephemeral apps should not be included in the list of notifiers to |
- // show in the UI. |
- settings_provider->GetNotifierList(¬ifiers); |
- EXPECT_FALSE(IsNotifierInList(notifier_id, notifiers)); |
-} |
- |
-// Verify that ephemeral apps will have no ability to retain file entries after |
-// close. Normal retainEntry behavior for installed apps is tested in |
-// FileSystemApiTest. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- DisableRetainFileSystemEntries) { |
- // Create a dummy file that we can just return to the test. |
- base::ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- base::FilePath temp_file; |
- ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &temp_file)); |
- |
- using extensions::FileSystemChooseEntryFunction; |
- FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( |
- &temp_file); |
- // The temporary file needs to be registered for the tests to pass on |
- // ChromeOS. |
- FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest( |
- "temp", temp_dir.path()); |
- |
- // The first test opens the file and writes the file handle to local storage. |
- const Extension* app = InstallEphemeralApp(kFileSystemTestApp, |
- Manifest::UNPACKED); |
- ASSERT_TRUE(LaunchAppAndRunTest(app, "OpenAndRetainFile")) << message_; |
- |
- // Verify that after the app has been closed, all retained entries are |
- // flushed. |
- std::vector<apps::SavedFileEntry> file_entries = |
- apps::SavedFilesService::Get(profile()) |
- ->GetAllFileEntries(app->id()); |
- EXPECT_TRUE(file_entries.empty()); |
- |
- // The second test verifies that the file cannot be reopened. |
- ASSERT_TRUE(LaunchAppAndRunTest(app, "RestoreRetainedFile")) << message_; |
-} |
- |
-// Checks the process of launching an ephemeral app and then promoting the app |
-// while it is running. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, PromoteAppWhileRunning) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- |
- PromoteEphemeralAppAndVerify(app, ExtensionRegistry::ENABLED); |
- |
- // Ensure that the app is not unloaded and disabled after it is closed. |
- CloseApp(app->id()); |
- VerifyPromotedApp(app->id(), ExtensionRegistry::ENABLED); |
-} |
- |
-// Checks the process of launching an ephemeral app and then promoting the app |
-// while it is idle. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, PromoteAppWhileIdle) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- VerifyInactiveEphemeralApp(app->id()); |
- |
- PromoteEphemeralAppAndVerify(app, ExtensionRegistry::ENABLED); |
-} |
- |
-// Verifies that promoting an ephemeral app that was disabled due to a |
-// permissions increase will enable it. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, PromoteAppAndGrantPermissions) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- DisableEphemeralApp(app, Extension::DISABLE_PERMISSIONS_INCREASE); |
- |
- PromoteEphemeralAppAndVerify(app, ExtensionRegistry::ENABLED); |
- EXPECT_FALSE(ExtensionPrefs::Get(profile()) |
- ->DidExtensionEscalatePermissions(app->id())); |
-} |
- |
-// Verifies that promoting an ephemeral app that has unsupported requirements |
-// will not enable it. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- PromoteUnsupportedEphemeralApp) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- DisableEphemeralApp(app, Extension::DISABLE_UNSUPPORTED_REQUIREMENT); |
- |
- // When promoted to a regular installed app, it should remain disabled. |
- // However, DISABLE_UNSUPPORTED_REQUIREMENT is not a syncable disable reason, |
- // so sync should still say "enabled". |
- bool expect_sync_enabled = true; |
- PromoteEphemeralAppAndVerify(app, ExtensionRegistry::DISABLED, |
- expect_sync_enabled); |
-} |
- |
-// Verifies that promoting an ephemeral app that is blacklisted will not enable |
-// it. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- PromoteBlacklistedEphemeralApp) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- |
- ExtensionService* service = |
- ExtensionSystem::Get(profile())->extension_service(); |
- service->BlacklistExtensionForTest(app->id()); |
- ASSERT_TRUE( |
- ExtensionRegistry::Get(profile())->blacklisted_extensions().Contains( |
- app->id())); |
- |
- // When promoted to a regular installed app, it should remain blacklisted. |
- PromoteEphemeralAppAndVerify(app, ExtensionRegistry::BLACKLISTED); |
- |
- // The app should be synced, but disabled. |
- scoped_ptr<ExtensionSyncData> sync_change = |
- GetLastSyncChangeForApp(app->id()); |
- VerifySyncChange(sync_change.get(), false); |
-} |
- |
-// Checks the process of promoting an ephemeral app from sync while the app is |
-// running. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- PromoteAppFromSyncWhileRunning) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- |
- PromoteEphemeralAppFromSyncAndVerify(app, true, ExtensionRegistry::ENABLED); |
- |
- // Ensure that the app is not unloaded and disabled after it is closed. |
- CloseApp(app->id()); |
- VerifyPromotedApp(app->id(), ExtensionRegistry::ENABLED); |
-} |
- |
-// Checks the process of promoting an ephemeral app from sync while the app is |
-// idle. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, PromoteAppFromSyncWhileIdle) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- VerifyInactiveEphemeralApp(app->id()); |
- |
- PromoteEphemeralAppFromSyncAndVerify(app, true, ExtensionRegistry::ENABLED); |
-} |
- |
-// Checks the process of promoting an ephemeral app from sync, where the app |
-// from sync is disabled, and the ephemeral app is running. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- PromoteDisabledAppFromSyncWhileRunning) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- |
- PromoteEphemeralAppFromSyncAndVerify(app, false, ExtensionRegistry::DISABLED); |
-} |
- |
-// Checks the process of promoting an ephemeral app from sync, where the app |
-// from sync is disabled, and the ephemeral app is idle. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- PromoteDisabledAppFromSyncWhileIdle) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- VerifyInactiveEphemeralApp(app->id()); |
- |
- PromoteEphemeralAppFromSyncAndVerify(app, false, ExtensionRegistry::DISABLED); |
-} |
- |
-// In most cases, ExtensionService::PromoteEphemeralApp() will be called to |
-// permanently install an ephemeral app. However, there may be cases where an |
-// install occurs through the usual route of installing from the Web Store (due |
-// to race conditions). Ensure that the app is still installed correctly. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- ReplaceEphemeralAppWithInstalledApp) { |
- InitSyncService(); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- CloseAppWaitForUnload(app->id()); |
- std::string app_id = app->id(); |
- app = NULL; |
- |
- InstallObserver installed_observer(profile()); |
- ReplaceEphemeralApp(app_id, kNotificationsTestApp, 1); |
- VerifyPromotedApp(app_id, ExtensionRegistry::ENABLED); |
- |
- // Check the notification parameters. |
- const InstallObserver::InstallParameters& params = installed_observer.Last(); |
- EXPECT_EQ(app_id, params.id); |
- EXPECT_TRUE(params.is_update); |
- EXPECT_TRUE(params.from_ephemeral); |
-} |
- |
-// This is similar to ReplaceEphemeralAppWithInstalledApp, but installs will |
-// be delayed until the app is idle. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- ReplaceEphemeralAppWithDelayedInstalledApp) { |
- InitSyncService(); |
- const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- std::string app_id = app->id(); |
- app = NULL; |
- |
- // Initiate install. |
- ReplaceEphemeralApp(app_id, kNotificationsTestApp, 0); |
- |
- // The delayed installation will occur when the ephemeral app is closed. |
- extensions::TestExtensionRegistryObserver observer( |
- ExtensionRegistry::Get(profile()), app_id); |
- InstallObserver installed_observer(profile()); |
- CloseAppWaitForUnload(app_id); |
- observer.WaitForExtensionWillBeInstalled(); |
- VerifyPromotedApp(app_id, ExtensionRegistry::ENABLED); |
- |
- // Check the notification parameters. |
- const InstallObserver::InstallParameters& params = installed_observer.Last(); |
- EXPECT_EQ(app_id, params.id); |
- EXPECT_TRUE(params.is_update); |
- EXPECT_TRUE(params.from_ephemeral); |
-} |
- |
-// Verifies that an installed app cannot turn into an ephemeral app as result of |
-// race conditions, i.e. an ephemeral app can be promoted to an installed app, |
-// but not vice versa. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- ReplaceInstalledAppWithEphemeralApp) { |
- const Extension* app = InstallPlatformApp(kNotificationsTestApp); |
- ASSERT_TRUE(app); |
- std::string app_id = app->id(); |
- app = NULL; |
- |
- EXPECT_FALSE(extensions::util::IsEphemeralApp(app_id, profile())); |
- app = |
- InstallEphemeralAppWithSourceAndFlags(GetTestPath(kNotificationsTestApp), |
- 0, |
- Manifest::INTERNAL, |
- Extension::NO_FLAGS); |
- EXPECT_FALSE(extensions::util::IsEphemeralApp(app_id, profile())); |
-} |
- |
-// Ephemerality was previously encoded by the Extension::IS_EPHEMERAL creation |
-// flag. This was changed to an "ephemeral_app" property. Check that the prefs |
-// are handled correctly. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, |
- ExtensionPrefBackcompatibility) { |
- // Ensure that apps with the old prefs are recognized as ephemeral. |
- const Extension* app = |
- InstallExtensionWithSourceAndFlags(GetTestPath(kNotificationsTestApp), |
- 1, |
- Manifest::INTERNAL, |
- Extension::IS_EPHEMERAL); |
- ASSERT_TRUE(app); |
- EXPECT_TRUE(extensions::util::IsEphemeralApp(app->id(), profile())); |
- |
- // Ensure that when the app is promoted to an installed app, the bit in the |
- // creation flags is cleared. |
- PromoteEphemeralApp(app); |
- EXPECT_FALSE(extensions::util::IsEphemeralApp(app->id(), profile())); |
- |
- int creation_flags = |
- ExtensionPrefs::Get(profile())->GetCreationFlags(app->id()); |
- EXPECT_EQ(0, creation_flags & Extension::IS_EPHEMERAL); |
-} |
- |
-// Verifies that the power keep awake will be automatically released for |
-// ephemeral apps that stop running. Well behaved apps should actually call |
-// chrome.power.releaseKeepAwake() themselves. |
-IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, ReleasePowerKeepAwake) { |
- PowerSettingsMock power_settings; |
- extensions::PowerAPI::Get(profile())->SetCreateBlockerFunctionForTesting( |
- base::Bind(&PowerSaveBlockerStub::Create, &power_settings)); |
- |
- const Extension* app = InstallAndLaunchEphemeralApp(kPowerTestApp); |
- ASSERT_TRUE(app); |
- EXPECT_EQ(1, power_settings.keep_awake_count()); |
- |
- CloseAppWaitForUnload(app->id()); |
- |
- EXPECT_EQ(0, power_settings.keep_awake_count()); |
-} |