blob: 3770272f7278f251ba770299b3734fbfd134fb23 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/extensions/controlled_home_dialog_controller.h"
#include "chrome/browser/ui/extensions/controlled_home_dialog_controller_interface.h"
#include "chrome/browser/ui/extensions/extensions_dialogs.h"
#include "chrome/test/interaction/interactive_browser_test.h"
#include "content/public/test/browser_test.h"
#include "extensions/browser/disable_reason.h"
#include "extensions/browser/extension_registrar.h"
#include "extensions/test/test_extension_dir.h"
namespace {
class TestDialogController : public ControlledHomeDialogControllerInterface {
public:
explicit TestDialogController(std::string action_id)
: action_id_(action_id) {}
TestDialogController(const TestDialogController&) = delete;
const TestDialogController& operator=(const TestDialogController&) = delete;
~TestDialogController() override = default;
bool ShouldShow() override { return true; }
std::u16string GetHeadingText() override { return u"heading"; }
std::u16string GetBodyText() override { return u"body"; }
std::u16string GetActionButtonText() override { return u"action"; }
std::u16string GetDismissButtonText() override { return u"dismiss"; }
std::string GetAnchorActionId() override { return action_id_; }
void OnBubbleShown() override {}
void OnBubbleClosed(CloseAction action) override {}
bool IsPolicyIndicationNeeded() const override { return false; }
private:
std::string action_id_;
};
} // namespace
class ControlledHomeDialogUITest
: public InteractiveBrowserTestMixin<extensions::ExtensionBrowserTest> {
public:
ControlledHomeDialogUITest() = default;
ControlledHomeDialogUITest(const ControlledHomeDialogUITest&) = delete;
ControlledHomeDialogUITest& operator=(const ControlledHomeDialogUITest&) =
delete;
~ControlledHomeDialogUITest() override = default;
scoped_refptr<const extensions::Extension> LoadExtensionOverridingHome(
const std::string& name) {
scoped_refptr<const extensions::Extension> extension =
LoadExtension(test_data_dir_.AppendASCII("api_test/override/newtab"));
return extension;
}
auto ShowControlledHomeDialog(const std::string& extension_id) {
return Do([&]() {
extensions::ShowControlledHomeDialog(
browser()->profile(), browser()->window()->GetNativeWindow(),
std::make_unique<TestDialogController>(extension_id));
});
}
auto DisableExtension(const extensions::ExtensionId& extension_id) {
return Do([&]() {
extension_registrar()->DisableExtension(
extension_id, {extensions::disable_reason::DISABLE_USER_ACTION});
});
}
private:
extensions::ExtensionRegistrar* extension_registrar() {
return extensions::ExtensionRegistrar::Get(browser()->profile());
}
};
IN_PROC_BROWSER_TEST_F(ControlledHomeDialogUITest,
DialogClosedWhenExtensionIsDisabled) {
scoped_refptr<const extensions::Extension> extension =
LoadExtensionOverridingHome("Extension");
RunTestSequence(
ShowControlledHomeDialog(extension->id()),
WaitForShow(extensions::kControlledHomeDialogCancelButtonElementId),
DisableExtension(extension->id()),
WaitForHide(extensions::kControlledHomeDialogCancelButtonElementId));
}