15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/apps/ephemeral_app_browsertest.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/apps/ephemeral_app_service.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_utils.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/manifest.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::Extension; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionPrefs; 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ExtensionRegistry; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kNumTestApps = 2; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kTestApps[] = { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "app_window/generic", 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "minimal" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class EphemeralAppServiceBrowserTest : public EphemeralAppTestBase { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void LoadApps() { 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < kNumTestApps; ++i) { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension = InstallEphemeralApp(kTestApps[i]); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(extension); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) app_ids_.push_back(extension->id()); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(kNumTestApps, (int) app_ids_.size()); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GarbageCollectEphemeralApps() { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EphemeralAppService* ephemeral_service = EphemeralAppService::Get( 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->profile()); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(ephemeral_service); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ephemeral_service->GarbageCollectApps(); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void InitEphemeralAppCount(EphemeralAppService* ephemeral_service) { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ephemeral_service->InitEphemeralAppCount(); 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DisableEphemeralAppsOnStartup() { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EphemeralAppService* ephemeral_service = 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EphemeralAppService::Get(browser()->profile()); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ephemeral_service); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ephemeral_service->DisableEphemeralAppsOnStartup(); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> app_ids_; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that inactive ephemeral apps are uninstalled and active apps are 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// not removed. Extensive testing of the ephemeral app cache's replacement 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// policies is done in the unit tests for EphemeralAppService. This is more 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// like an integration test. 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GarbageCollectInactiveApps) { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EphemeralAppService* ephemeral_service = 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EphemeralAppService::Get(browser()->profile()); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(ephemeral_service); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitEphemeralAppCount(ephemeral_service); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoadApps(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Time time_now = base::Time::Now(); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile()); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prefs); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set launch time for an inactive app. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string inactive_app_id = app_ids_[0]; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time inactive_launch = time_now - 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromDays(EphemeralAppService::kAppInactiveThreshold + 1); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->SetLastLaunchTime(inactive_app_id, inactive_launch); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set launch time for an active app. 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string active_app_id = app_ids_[1]; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time active_launch = time_now - 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromDays(EphemeralAppService::kAppKeepThreshold); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->SetLastLaunchTime(active_app_id, active_launch); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Perform garbage collection. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver uninstall_signal( 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<Profile>(browser()->profile())); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GarbageCollectEphemeralApps(); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uninstall_signal.Wait(); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(registry); 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(registry->GetExtensionById(inactive_app_id, 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::EVERYTHING)); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE( 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry->GetExtensionById(active_app_id, ExtensionRegistry::EVERYTHING)); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verify that the count of ephemeral apps is maintained correctly. 110116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, EphemeralAppCount) { 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EphemeralAppService* ephemeral_service = 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EphemeralAppService::Get(browser()->profile()); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(ephemeral_service); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitEphemeralAppCount(ephemeral_service); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The count should not increase for regular installed apps. 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(InstallPlatformApp("minimal")); 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, ephemeral_service->ephemeral_app_count()); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The count should increase when an ephemeral app is added. 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* app = InstallEphemeralApp(kMessagingReceiverApp); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(app); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The count should remain constant if the ephemeral app is updated. 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string app_id = app->id(); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) app = UpdateEphemeralApp( 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) app_id, GetTestPath(kMessagingReceiverAppV2), 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetTestPath(kMessagingReceiverApp).ReplaceExtension( 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE_PATH_LITERAL(".pem"))); 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(app); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The count should decrease when an ephemeral app is promoted to a regular 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // installed app. 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PromoteEphemeralApp(app); 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, ephemeral_service->ephemeral_app_count()); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verify that the cache of ephemeral apps is correctly cleared. Running apps 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// should not be removed. 142116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, ClearCachedApps) { 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* running_app = 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstallAndLaunchEphemeralApp(kMessagingReceiverApp); 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* inactive_app = 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstallAndLaunchEphemeralApp(kDispatchEventTestApp); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string inactive_app_id = inactive_app->id(); 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string running_app_id = running_app->id(); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CloseAppWaitForUnload(inactive_app_id); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EphemeralAppService* ephemeral_service = 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EphemeralAppService::Get(browser()->profile()); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(ephemeral_service); 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2, ephemeral_service->ephemeral_app_count()); 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ephemeral_service->ClearCachedApps(); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(registry); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(registry->GetExtensionById(inactive_app_id, 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::EVERYTHING)); 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(registry->GetExtensionById(running_app_id, 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::EVERYTHING)); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Verify that the service will unload and disable ephemeral apps on startup. 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DisableEphemeralAppsOnStartup) { 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* installed_app = InstallPlatformApp(kNotificationsTestApp); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* running_app = 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InstallAndLaunchEphemeralApp(kMessagingReceiverApp); 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* inactive_app = InstallEphemeralApp(kDispatchEventTestApp); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* disabled_app = InstallEphemeralApp(kFileSystemTestApp); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(installed_app); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(running_app); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(inactive_app); 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(disabled_app); 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DisableEphemeralApp(disabled_app, Extension::DISABLE_PERMISSIONS_INCREASE); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(registry); 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->enabled_extensions().Contains(installed_app->id())); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->enabled_extensions().Contains(running_app->id())); 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->enabled_extensions().Contains(inactive_app->id())); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->disabled_extensions().Contains(disabled_app->id())); 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DisableEphemeralAppsOnStartup(); 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Verify that the inactive app is disabled. 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->enabled_extensions().Contains(installed_app->id())); 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->enabled_extensions().Contains(running_app->id())); 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->disabled_extensions().Contains(inactive_app->id())); 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry->disabled_extensions().Contains(disabled_app->id())); 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(prefs); 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(prefs->HasDisableReason( 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) installed_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP)); 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(prefs->HasDisableReason( 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) running_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP)); 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(prefs->HasDisableReason( 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) inactive_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP)); 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(prefs->HasDisableReason( 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) disabled_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP)); 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(prefs->HasDisableReason( 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) disabled_app->id(), Extension::DISABLE_PERMISSIONS_INCREASE)); 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 210