shell_keep_alive_requester_unittest.cc 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "extensions/shell/browser/shell_keep_alive_requester.h"
  5. #include <memory>
  6. #include "apps/app_lifetime_monitor_factory.h"
  7. #include "components/keep_alive_registry/keep_alive_registry.h"
  8. #include "content/public/browser/browser_context.h"
  9. #include "extensions/browser/disable_reason.h"
  10. #include "extensions/browser/extension_prefs.h"
  11. #include "extensions/browser/extension_registry.h"
  12. #include "extensions/browser/extensions_test.h"
  13. #include "extensions/browser/unloaded_extension_reason.h"
  14. #include "extensions/common/extension.h"
  15. #include "extensions/common/extension_builder.h"
  16. #include "extensions/common/extension_id.h"
  17. namespace extensions {
  18. class ShellKeepAliveRequesterTest : public ExtensionsTest {
  19. public:
  20. ShellKeepAliveRequesterTest(const ShellKeepAliveRequesterTest&) = delete;
  21. ShellKeepAliveRequesterTest& operator=(const ShellKeepAliveRequesterTest&) =
  22. delete;
  23. protected:
  24. ShellKeepAliveRequesterTest() = default;
  25. ~ShellKeepAliveRequesterTest() override = default;
  26. void SetUp() override {
  27. // Register factory so it's created with the BrowserContext.
  28. apps::AppLifetimeMonitorFactory::GetInstance();
  29. ExtensionsTest::SetUp();
  30. keep_alive_requester_ =
  31. std::make_unique<ShellKeepAliveRequester>(browser_context());
  32. }
  33. void TearDown() override {
  34. keep_alive_requester_.reset();
  35. ExtensionsTest::TearDown();
  36. }
  37. protected:
  38. std::unique_ptr<ShellKeepAliveRequester> keep_alive_requester_;
  39. };
  40. // Tests with an extension.
  41. TEST_F(ShellKeepAliveRequesterTest, Extension) {
  42. scoped_refptr<const Extension> extension =
  43. ExtensionBuilder("extension", ExtensionBuilder::Type::EXTENSION).Build();
  44. // No keep-alive is used for extensions that aren't platform apps.
  45. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  46. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  47. ExtensionPrefs::Get(browser_context())
  48. ->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
  49. keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
  50. UnloadedExtensionReason::DISABLE);
  51. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  52. }
  53. // Tests with a platform app.
  54. TEST_F(ShellKeepAliveRequesterTest, PlatformApp) {
  55. scoped_refptr<const Extension> extension =
  56. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  57. .Build();
  58. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  59. // Expect a keep-alive while waiting for the app to launch a window.
  60. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  61. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  62. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  63. // No keep-alives are registered if the extension stops running.
  64. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  65. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  66. }
  67. // Tests with a platform app that doesn't open a window.
  68. TEST_F(ShellKeepAliveRequesterTest, PlatformAppNoWindow) {
  69. scoped_refptr<const Extension> extension =
  70. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  71. .Build();
  72. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  73. // Expect a keep-alive while waiting for the app to launch a window.
  74. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  75. // Eventually, the app's background host is destroyed.
  76. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  77. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  78. }
  79. // Tests with a platform app that is reloaded.
  80. TEST_F(ShellKeepAliveRequesterTest, PlatformAppReload) {
  81. scoped_refptr<const Extension> extension =
  82. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  83. .Build();
  84. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  85. // Expect a keep-alive while waiting for the app to launch a window.
  86. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  87. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  88. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  89. // Disable the app for a reload.
  90. keep_alive_requester_->StartTrackingReload(extension.get());
  91. ExtensionPrefs::Get(browser_context())
  92. ->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
  93. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  94. keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
  95. UnloadedExtensionReason::DISABLE);
  96. // Expect a keep-alive while waiting for the app to finish reloading.
  97. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  98. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  99. keep_alive_requester_->StopTrackingReload(extension->id());
  100. // Expect a keep-alive while waiting for the app to launch a window again.
  101. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  102. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  103. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  104. }
  105. // Tests with a platform app that is reloaded, but fails to load.
  106. TEST_F(ShellKeepAliveRequesterTest, PlatformAppReloadFailure) {
  107. scoped_refptr<const Extension> extension =
  108. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  109. .Build();
  110. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  111. // Expect a keep-alive while waiting for the app to launch a window.
  112. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  113. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  114. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  115. // Disable the app for a reload.
  116. keep_alive_requester_->StartTrackingReload(extension.get());
  117. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  118. ExtensionPrefs::Get(browser_context())
  119. ->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
  120. keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
  121. UnloadedExtensionReason::DISABLE);
  122. // Expect a keep-alive while waiting for the app to finish reloading that is
  123. // removed when the app fails to load.
  124. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  125. keep_alive_requester_->StopTrackingReload(extension->id());
  126. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  127. }
  128. // Tests with a platform app that reloads before opening a window.
  129. TEST_F(ShellKeepAliveRequesterTest, PlatformAppNoWindowReload) {
  130. scoped_refptr<const Extension> extension =
  131. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  132. .Build();
  133. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  134. // Expect a keep-alive while waiting for the app to launch a window.
  135. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  136. // Disable the app for a reload.
  137. keep_alive_requester_->StartTrackingReload(extension.get());
  138. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  139. ExtensionPrefs::Get(browser_context())
  140. ->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
  141. keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
  142. UnloadedExtensionReason::DISABLE);
  143. // Expect a keep-alive while waiting for the app to finish reloading.
  144. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  145. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  146. keep_alive_requester_->StopTrackingReload(extension->id());
  147. // Expect a keep-alive while waiting for the app to launch a window.
  148. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  149. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  150. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  151. }
  152. // Tests with a platform app that is reloaded, but doesn't open a window again.
  153. TEST_F(ShellKeepAliveRequesterTest, PlatformAppReloadNoWindow) {
  154. scoped_refptr<const Extension> extension =
  155. ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
  156. .Build();
  157. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  158. // Expect a keep-alive while waiting for the app to launch a window.
  159. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  160. keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
  161. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  162. // Disable the app for a reload.
  163. keep_alive_requester_->StartTrackingReload(extension.get());
  164. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  165. ExtensionPrefs::Get(browser_context())
  166. ->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
  167. keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
  168. UnloadedExtensionReason::DISABLE);
  169. // Expect a keep-alive while waiting for the app to finish reloading.
  170. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  171. keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
  172. keep_alive_requester_->StopTrackingReload(extension->id());
  173. // Expect a keep-alive while waiting for the app to launch a window again.
  174. EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  175. // Eventually the app stops.
  176. keep_alive_requester_->OnAppStop(browser_context(), extension->id());
  177. EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
  178. }
  179. } // namespace extensions