#include "extensions/shell/browser/shell_keep_alive_requester.h"
#include <memory>
#include "apps/app_lifetime_monitor_factory.h"
#include "components/keep_alive_registry/keep_alive_registry.h"
#include "content/public/browser/browser_context.h"
#include "extensions/browser/disable_reason.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extensions_test.h"
#include "extensions/browser/unloaded_extension_reason.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/extension_id.h"
namespace extensions {
class ShellKeepAliveRequesterTest : public ExtensionsTest {
public:
ShellKeepAliveRequesterTest(const ShellKeepAliveRequesterTest&) = delete;
ShellKeepAliveRequesterTest& operator=(const ShellKeepAliveRequesterTest&) =
delete;
protected:
ShellKeepAliveRequesterTest() = default;
~ShellKeepAliveRequesterTest() override = default;
void SetUp() override {
apps::AppLifetimeMonitorFactory::GetInstance();
ExtensionsTest::SetUp();
keep_alive_requester_ =
std::make_unique<ShellKeepAliveRequester>(browser_context());
}
void TearDown() override {
keep_alive_requester_.reset();
ExtensionsTest::TearDown();
}
protected:
std::unique_ptr<ShellKeepAliveRequester> keep_alive_requester_;
};
TEST_F(ShellKeepAliveRequesterTest, Extension) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("extension", ExtensionBuilder::Type::EXTENSION).Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
ExtensionPrefs::Get(browser_context())
->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
UnloadedExtensionReason::DISABLE);
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformApp) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformAppNoWindow) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformAppReload) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->StartTrackingReload(extension.get());
ExtensionPrefs::Get(browser_context())
->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
UnloadedExtensionReason::DISABLE);
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
keep_alive_requester_->StopTrackingReload(extension->id());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformAppReloadFailure) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->StartTrackingReload(extension.get());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
ExtensionPrefs::Get(browser_context())
->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
UnloadedExtensionReason::DISABLE);
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->StopTrackingReload(extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformAppNoWindowReload) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->StartTrackingReload(extension.get());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
ExtensionPrefs::Get(browser_context())
->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
UnloadedExtensionReason::DISABLE);
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
keep_alive_requester_->StopTrackingReload(extension->id());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
TEST_F(ShellKeepAliveRequesterTest, PlatformAppReloadNoWindow) {
scoped_refptr<const Extension> extension =
ExtensionBuilder("platform_app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppActivated(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->StartTrackingReload(extension.get());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
ExtensionPrefs::Get(browser_context())
->AddDisableReason(extension->id(), disable_reason::DISABLE_RELOAD);
keep_alive_requester_->OnExtensionUnloaded(browser_context(), extension.get(),
UnloadedExtensionReason::DISABLE);
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnExtensionLoaded(browser_context(), extension.get());
keep_alive_requester_->StopTrackingReload(extension->id());
EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
keep_alive_requester_->OnAppStop(browser_context(), extension->id());
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
}
}