1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/enterprise/data_controls/desktop_data_controls_dialog.h"
#include "base/functional/callback_helpers.h"
#include "chrome/browser/enterprise/data_controls/desktop_data_controls_dialog_factory.h"
#include "chrome/browser/enterprise/data_controls/desktop_data_controls_dialog_test_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/test/test_browser_dialog.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/browser_test.h"
#include "ui/base/mojom/dialog_button.mojom.h"
namespace data_controls {
namespace {
class DesktopDataControlsDialogUiTest
: public DialogBrowserTest,
public testing::WithParamInterface<DataControlsDialog::Type> {
public:
DesktopDataControlsDialogUiTest() = default;
~DesktopDataControlsDialogUiTest() override = default;
DataControlsDialog::Type type() const { return GetParam(); }
// DialogBrowserTest:
void ShowUi(const std::string& name) override {
helper_ = std::make_unique<DesktopDataControlsDialogTestHelper>(type());
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(), type());
}
void DismissUi() override {
helper_->CloseDialogWithoutBypass();
helper_->WaitForDialogToClose();
}
private:
std::unique_ptr<DesktopDataControlsDialogTestHelper> helper_;
};
class DesktopDataControlsDialogTest : public InProcessBrowserTest,
public DesktopDataControlsDialog::TestObserver {
public:
void OnConstructed(DesktopDataControlsDialog* dialog,
views::DialogDelegate* delegate) override {
++constructor_called_count_;
ASSERT_TRUE(dialog);
ASSERT_TRUE(delegate);
ASSERT_EQ(delegate->GetDefaultDialogButton(),
static_cast<int>(ui::mojom::DialogButton::kOk));
ASSERT_FALSE(base::Contains(delegates_, dialog));
ASSERT_FALSE(base::Contains(dialog_close_loops_, dialog));
ASSERT_FALSE(base::Contains(dialog_close_callbacks_, dialog));
delegates_[dialog] = delegate;
dialog_close_loops_[dialog] = std::make_unique<base::RunLoop>();
dialog_close_callbacks_[dialog] =
dialog_close_loops_[dialog]->QuitClosure();
}
void OnDestructed(DesktopDataControlsDialog* dialog) override {
ASSERT_TRUE(dialog);
ASSERT_TRUE(base::Contains(delegates_, dialog));
ASSERT_TRUE(base::Contains(dialog_close_loops_, dialog));
ASSERT_TRUE(base::Contains(dialog_close_callbacks_, dialog));
std::move(dialog_close_callbacks_[dialog]).Run();
}
void CloseDialogsAndWait() {
ASSERT_EQ(dialog_close_loops_.size(), constructor_called_count_);
ASSERT_EQ(dialog_close_callbacks_.size(), constructor_called_count_);
for (auto& dialog_and_loop : dialog_close_loops_) {
// Some platforms crash if the dialog has been cancelled before fully
// launching modally, so to avoid that issue cancelling the dialog is done
// asynchronously.
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(&views::DialogDelegate::AcceptDialog,
base::Unretained(delegates_[dialog_and_loop.first])));
}
for (auto& dialog_and_loop : dialog_close_loops_) {
dialog_and_loop.second->Run();
}
}
protected:
size_t constructor_called_count_ = 0;
std::map<DesktopDataControlsDialog*, views::DialogDelegate*> delegates_;
std::map<DesktopDataControlsDialog*, base::OnceClosure>
dialog_close_callbacks_;
std::map<DesktopDataControlsDialog*, std::unique_ptr<base::RunLoop>>
dialog_close_loops_;
};
} // namespace
IN_PROC_BROWSER_TEST_P(DesktopDataControlsDialogUiTest, DefaultUi) {
ShowAndVerifyUi();
}
INSTANTIATE_TEST_SUITE_P(
All,
DesktopDataControlsDialogUiTest,
testing::Values(DataControlsDialog::Type::kClipboardPasteBlock,
DataControlsDialog::Type::kClipboardCopyBlock,
DataControlsDialog::Type::kClipboardPasteWarn,
DataControlsDialog::Type::kClipboardCopyWarn));
IN_PROC_BROWSER_TEST_F(DesktopDataControlsDialogTest, ShowDialogMultipleTimes) {
// Only 1 dialog should be shown for the same WebContents-Type pair.
for (int i = 0; i < 100; ++i) {
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardCopyBlock);
}
ASSERT_EQ(constructor_called_count_, 1u);
CloseDialogsAndWait();
}
IN_PROC_BROWSER_TEST_F(DesktopDataControlsDialogTest,
ShowDialogMultipleTimes_DifferentTypes) {
// Distinct dialogs should be created for different types.
for (int i = 0; i < 100; ++i) {
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardCopyBlock);
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardPasteBlock);
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardPasteWarn);
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardCopyWarn);
}
ASSERT_EQ(constructor_called_count_, 4u);
CloseDialogsAndWait();
}
IN_PROC_BROWSER_TEST_F(DesktopDataControlsDialogTest,
ShowDialogMultipleTimes_DifferentWebContents) {
// Distinct dialogs should be created for different WebContents.
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardCopyBlock);
chrome::NewTab(browser());
DesktopDataControlsDialogFactory::GetInstance()->ShowDialogIfNeeded(
browser()->tab_strip_model()->GetActiveWebContents(),
DataControlsDialog::Type::kClipboardCopyBlock);
ASSERT_EQ(constructor_called_count_, 2u);
CloseDialogsAndWait();
}
} // namespace data_controls
|