| // 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)); |
| } |