De-anonymize code that will call deprecated WidgetDelegate APIs.
These APIs will be locked with passkeys, which requires friending the caller code, which requires it to be forward-declared, which means it can't be in an anonymous namespace. Bug: 407812144 Change-Id: I42c261f08f094badc0fc9f41ee22b485aa00e8c8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6435150 Commit-Queue: Peter Kasting <pkasting@chromium.org> Reviewed-by: Mitsuru Oshima <oshima@chromium.org> Reviewed-by: Nancy Xiao <nancylanxiao@google.com> Reviewed-by: Dana Fried <dfried@chromium.org> Reviewed-by: Trevor Perrier <perrier@chromium.org> Cr-Commit-Position: refs/heads/main@{#1443749}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
ca2b56e91b
commit
ca6806f38a
ash
ambient
auth
in_session_auth
auth_dialog_contents_view_pixeltest.ccauth_dialog_contents_view_unittest.ccin_session_auth_dialog.ccin_session_auth_dialog_controller_impl.cc
login
shell_unittest.ccwm
chrome
browser
enterprise
connectors
glic
widget
ui
ash
shelf
app_service
views
borealis
crostini
download
external_protocol_handler_ash.ccscreen_capture_notification_ui_views.ccweb_dialog_view_browsertest.ccwebid
test
ui/views/widget
@ -177,15 +177,6 @@ bool IsAmbientModeEnabled() {
|
||||
return IsUserAmbientModeEnabled() || IsAmbientModeManagedScreensaverEnabled();
|
||||
}
|
||||
|
||||
class AmbientWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
AmbientWidgetDelegate() {
|
||||
SetCanFullscreen(true);
|
||||
SetCanMaximize(true);
|
||||
SetOwnedByWidget(true);
|
||||
}
|
||||
};
|
||||
|
||||
void RecordManagedScreensaverEnabledPref() {
|
||||
if (PrefService* pref_service = GetActivePrefService();
|
||||
pref_service &&
|
||||
@ -198,6 +189,15 @@ void RecordManagedScreensaverEnabledPref() {
|
||||
|
||||
} // namespace
|
||||
|
||||
class AmbientWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
AmbientWidgetDelegate() {
|
||||
SetCanFullscreen(true);
|
||||
SetCanMaximize(true);
|
||||
SetOwnedByWidget(true);
|
||||
}
|
||||
};
|
||||
|
||||
// static
|
||||
void AmbientController::RegisterProfilePrefs(PrefRegistrySimple* registry) {
|
||||
registry->RegisterStringPref(ash::ambient::prefs::kAmbientBackdropClientId,
|
||||
|
@ -70,32 +70,6 @@ std::string GetUserSalt(const AccountId& account_id) {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::unique_ptr<views::Widget> CreateAuthDialogWidget(
|
||||
std::unique_ptr<views::View> contents_view) {
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::CLIENT_OWNS_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
CHECK_EQ(Shell::Get()->session_controller()->GetSessionState(),
|
||||
session_manager::SessionState::ACTIVE);
|
||||
params.parent = Shell::GetPrimaryRootWindow()->GetChildById(
|
||||
kShellWindowId_SystemModalContainer);
|
||||
params.autosize = true;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
std::unique_ptr<views::Widget> widget = std::make_unique<views::Widget>();
|
||||
widget->Init(std::move(params));
|
||||
widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget->SetContentsView(std::move(contents_view));
|
||||
return widget;
|
||||
}
|
||||
|
||||
const char* ReasonToString(AuthRequest::Reason reason) {
|
||||
switch (reason) {
|
||||
case AuthRequest::Reason::kPasswordManager:
|
||||
@ -448,7 +422,28 @@ void ActiveSessionAuthControllerImpl::InitUi() {
|
||||
account_id_, title_, description_, available_factors_);
|
||||
contents_view_ = contents_view.get();
|
||||
|
||||
widget_ = CreateAuthDialogWidget(std::move(contents_view));
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::CLIENT_OWNS_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
CHECK_EQ(Shell::Get()->session_controller()->GetSessionState(),
|
||||
session_manager::SessionState::ACTIVE);
|
||||
params.parent = Shell::GetPrimaryRootWindow()->GetChildById(
|
||||
kShellWindowId_SystemModalContainer);
|
||||
params.autosize = true;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
widget_ = std::make_unique<views::Widget>();
|
||||
widget_->Init(std::move(params));
|
||||
widget_->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget_->SetContentsView(std::move(contents_view));
|
||||
|
||||
contents_view_observer_.Observe(contents_view_);
|
||||
contents_view_->AddObserver(this);
|
||||
SetState(ActiveSessionAuthState::kInitialized);
|
||||
|
@ -35,8 +35,6 @@
|
||||
|
||||
namespace ash {
|
||||
|
||||
namespace {
|
||||
|
||||
class AuthDialogContentsViewPixelTest : public AshTestBase {
|
||||
public:
|
||||
AuthDialogContentsViewPixelTest() = default;
|
||||
@ -308,6 +306,4 @@ TEST_F(AuthDialogContentsViewPixelTest, AllFactorAndThemeChange) {
|
||||
"fingerprint_light", /*revision_number=*/4, widget.get()));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace ash
|
||||
|
@ -24,8 +24,6 @@
|
||||
|
||||
namespace ash {
|
||||
|
||||
namespace {
|
||||
|
||||
class AuthDialogContentsViewTest : public AshTestBase {
|
||||
public:
|
||||
AuthDialogContentsViewTest() = default;
|
||||
@ -148,6 +146,4 @@ TEST_F(AuthDialogContentsViewTest, AccessibleProperties) {
|
||||
EXPECT_EQ(data.role, ax::mojom::Role::kStaticText);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace ash
|
||||
|
@ -26,29 +26,6 @@ namespace {
|
||||
// address bar, for anti-spoofing.
|
||||
constexpr int kTopInsetDp = 36;
|
||||
|
||||
std::unique_ptr<views::Widget> CreateAuthDialogWidget(
|
||||
std::unique_ptr<views::View> contents_view,
|
||||
aura::Window* parent) {
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
params.parent = parent;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kNone);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
std::unique_ptr<views::Widget> widget = std::make_unique<views::Widget>();
|
||||
widget->Init(std::move(params));
|
||||
widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget->SetContentsView(std::move(contents_view));
|
||||
return widget;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
InSessionAuthDialog::InSessionAuthDialog(
|
||||
@ -58,10 +35,26 @@ InSessionAuthDialog::InSessionAuthDialog(
|
||||
const AuthDialogContentsView::AuthMethodsMetadata& auth_metadata,
|
||||
const UserAvatar& avatar)
|
||||
: auth_methods_(auth_methods) {
|
||||
widget_ = CreateAuthDialogWidget(
|
||||
std::make_unique<AuthDialogContentsView>(auth_methods, origin_name,
|
||||
auth_metadata, avatar),
|
||||
parent_window);
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
params.parent = parent_window;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
auto contents_view = std::make_unique<AuthDialogContentsView>(
|
||||
auth_methods, origin_name, auth_metadata, avatar);
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kNone);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
widget_ = std::make_unique<views::Widget>();
|
||||
widget_->Init(std::move(params));
|
||||
widget_->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget_->SetContentsView(std::move(contents_view));
|
||||
|
||||
gfx::Rect bounds = parent_window->GetBoundsInScreen();
|
||||
gfx::Size preferred_size = widget_->GetContentsView()->GetPreferredSize();
|
||||
int horizontal_inset_dp = (bounds.width() - preferred_size.width()) / 2;
|
||||
|
@ -56,28 +56,6 @@ AuthPurpose InSessionAuthReasonToAuthPurpose(
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<views::Widget> CreateAuthDialogWidget(
|
||||
std::unique_ptr<views::View> contents_view) {
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
params.parent = nullptr;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
std::unique_ptr<views::Widget> widget = std::make_unique<views::Widget>();
|
||||
widget->Init(std::move(params));
|
||||
widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget->SetContentsView(std::move(contents_view));
|
||||
return widget;
|
||||
}
|
||||
|
||||
// TODO(b/271248452): Subscribe to primary display changes, so that the
|
||||
// authentication dialog correctly changes its location to center on new
|
||||
// primary displays. We will need to also listen to `work_area` changes and
|
||||
@ -183,8 +161,26 @@ void InSessionAuthDialogControllerImpl::OnUserAuthAttemptConfirmed(
|
||||
|
||||
contents_view_ = contents_view.get();
|
||||
out_consumer = contents_view->GetAuthPanel();
|
||||
dialog_ = CreateAuthDialogWidget(std::move(contents_view));
|
||||
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
params.parent = nullptr;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
dialog_ = std::make_unique<views::Widget>();
|
||||
dialog_->Init(std::move(params));
|
||||
dialog_->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
dialog_->SetContentsView(std::move(contents_view));
|
||||
dialog_->Show();
|
||||
|
||||
state_ = State::kShown;
|
||||
AuthParts::Get()
|
||||
->GetLegacyAuthSurfaceRegistry()
|
||||
|
@ -123,40 +123,6 @@ std::string GetUserSalt(const AccountId& account_id) {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::unique_ptr<views::Widget> CreateAuthDialogWidget(
|
||||
std::unique_ptr<views::View> contents_view) {
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::CLIENT_OWNS_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
|
||||
ShellWindowId parent_window_id =
|
||||
Shell::Get()->session_controller()->GetSessionState() ==
|
||||
session_manager::SessionState::ACTIVE
|
||||
? kShellWindowId_SystemModalContainer
|
||||
: kShellWindowId_LockSystemModalContainer;
|
||||
params.parent = Shell::GetPrimaryRootWindow()->GetChildById(parent_window_id);
|
||||
|
||||
params.autosize = true;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
// ModalType::kSystem is used to get a semi-transparent background behind the
|
||||
// local authentication request view, when it is used directly on a widget.
|
||||
// The overlay consumes all the inputs from the user, so that they can only
|
||||
// interact with the local authentication request view while it is visible.
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
auto widget = std::make_unique<views::Widget>();
|
||||
widget->Init(std::move(params));
|
||||
widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget->SetContentsView(std::move(contents_view));
|
||||
return widget;
|
||||
}
|
||||
|
||||
const char* LocalAuthenticationWithPinStateToString(
|
||||
LocalAuthenticationWithPinControllerImpl::LocalAuthenticationWithPinState
|
||||
state) {
|
||||
@ -245,7 +211,36 @@ bool LocalAuthenticationWithPinControllerImpl::ShowWidget(
|
||||
account_id_, title_, description_, available_factors_);
|
||||
contents_view_ = contents_view.get();
|
||||
|
||||
widget_ = CreateAuthDialogWidget(std::move(contents_view));
|
||||
views::Widget::InitParams params(
|
||||
views::Widget::InitParams::CLIENT_OWNS_WIDGET,
|
||||
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
||||
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
|
||||
params.delegate = new views::WidgetDelegate();
|
||||
params.show_state = ui::mojom::WindowShowState::kNormal;
|
||||
|
||||
ShellWindowId parent_window_id =
|
||||
Shell::Get()->session_controller()->GetSessionState() ==
|
||||
session_manager::SessionState::ACTIVE
|
||||
? kShellWindowId_SystemModalContainer
|
||||
: kShellWindowId_LockSystemModalContainer;
|
||||
params.parent = Shell::GetPrimaryRootWindow()->GetChildById(parent_window_id);
|
||||
|
||||
params.autosize = true;
|
||||
params.name = "AuthDialogWidget";
|
||||
|
||||
params.delegate->SetInitiallyFocusedView(contents_view.get());
|
||||
// ModalType::kSystem is used to get a semi-transparent background behind the
|
||||
// local authentication request view, when it is used directly on a widget.
|
||||
// The overlay consumes all the inputs from the user, so that they can only
|
||||
// interact with the local authentication request view while it is visible.
|
||||
params.delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
params.delegate->SetOwnedByWidget(true);
|
||||
|
||||
widget_ = std::make_unique<views::Widget>();
|
||||
widget_->Init(std::move(params));
|
||||
widget_->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE);
|
||||
widget_->SetContentsView(std::move(contents_view));
|
||||
|
||||
contents_view_observer_.Observe(contents_view_);
|
||||
contents_view_->AddObserver(this);
|
||||
SetState(LocalAuthenticationWithPinState::kInitialized);
|
||||
|
@ -141,15 +141,6 @@ void ExpectAllContainers() {
|
||||
EXPECT_FALSE(Shell::GetContainer(root_window, kShellWindowId_PhantomWindow));
|
||||
}
|
||||
|
||||
std::unique_ptr<views::WidgetDelegateView> CreateModalWidgetDelegate() {
|
||||
auto delegate = std::make_unique<views::WidgetDelegateView>();
|
||||
delegate->SetCanResize(true);
|
||||
delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
delegate->SetOwnedByWidget(true);
|
||||
delegate->SetTitle(u"Modal Window");
|
||||
return delegate;
|
||||
}
|
||||
|
||||
class SimpleMenuDelegate : public ui::SimpleMenuModel::Delegate {
|
||||
public:
|
||||
SimpleMenuDelegate() = default;
|
||||
@ -170,6 +161,16 @@ class SimpleMenuDelegate : public ui::SimpleMenuModel::Delegate {
|
||||
|
||||
class ShellTest : public AshTestBase {
|
||||
public:
|
||||
static std::unique_ptr<views::WidgetDelegateView>
|
||||
CreateModalWidgetDelegate() {
|
||||
auto delegate = std::make_unique<views::WidgetDelegateView>();
|
||||
delegate->SetCanResize(true);
|
||||
delegate->SetModalType(ui::mojom::ModalType::kSystem);
|
||||
delegate->SetOwnedByWidget(true);
|
||||
delegate->SetTitle(u"Modal Window");
|
||||
return delegate;
|
||||
}
|
||||
|
||||
void TestCreateWindow(views::Widget::InitParams::Type type,
|
||||
bool always_on_top,
|
||||
aura::Window* expected_container) {
|
||||
|
@ -176,6 +176,30 @@
|
||||
|
||||
namespace ash {
|
||||
|
||||
// A widget delegate that refuses to close.
|
||||
class StuckWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
StuckWidgetDelegate() {
|
||||
SetCanMaximize(true);
|
||||
SetCanMinimize(true);
|
||||
SetCanResize(true);
|
||||
SetOwnedByWidget(true);
|
||||
}
|
||||
StuckWidgetDelegate(const StuckWidgetDelegate& other) = delete;
|
||||
StuckWidgetDelegate& operator=(const StuckWidgetDelegate& other) = delete;
|
||||
~StuckWidgetDelegate() override = default;
|
||||
|
||||
// Overridden from WidgetDelegate:
|
||||
std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView(
|
||||
views::Widget* widget) override {
|
||||
return Shell::Get()->CreateDefaultNonClientFrameView(widget);
|
||||
}
|
||||
|
||||
bool OnCloseRequested(views::Widget::ClosedReason close_reason) override {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
using ::testing::ElementsAre;
|
||||
@ -427,30 +451,6 @@ class FullScreenStateObserver : public ShellObserver {
|
||||
bool is_fullscreen_ = false;
|
||||
};
|
||||
|
||||
// A widget delegate that refuses to close.
|
||||
class StuckWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
StuckWidgetDelegate() {
|
||||
SetCanMaximize(true);
|
||||
SetCanMinimize(true);
|
||||
SetCanResize(true);
|
||||
SetOwnedByWidget(true);
|
||||
}
|
||||
StuckWidgetDelegate(const StuckWidgetDelegate& other) = delete;
|
||||
StuckWidgetDelegate& operator=(const StuckWidgetDelegate& other) = delete;
|
||||
~StuckWidgetDelegate() override = default;
|
||||
|
||||
// Overridden from WidgetDelegate:
|
||||
std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView(
|
||||
views::Widget* widget) override {
|
||||
return Shell::Get()->CreateDefaultNonClientFrameView(widget);
|
||||
}
|
||||
|
||||
bool OnCloseRequested(views::Widget::ClosedReason close_reason) override {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
struct DesksTestParams {
|
||||
bool use_touch_gestures = false;
|
||||
bool use_16_desks = false;
|
||||
|
@ -27,8 +27,6 @@
|
||||
|
||||
namespace ash {
|
||||
|
||||
namespace {
|
||||
|
||||
// A login implementation of WidgetDelegate.
|
||||
class LoginTestWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
@ -51,8 +49,6 @@ class LoginTestWidgetDelegate : public views::WidgetDelegate {
|
||||
raw_ptr<views::Widget> widget_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
class LockLayoutManagerTest : public AshTestBase {
|
||||
public:
|
||||
void SetUp() override {
|
||||
|
@ -50,57 +50,6 @@
|
||||
|
||||
namespace enterprise_connectors {
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr base::TimeDelta kNoDelay = base::Seconds(0);
|
||||
constexpr base::TimeDelta kSmallDelay = base::Milliseconds(300);
|
||||
constexpr base::TimeDelta kNormalDelay = base::Milliseconds(500);
|
||||
|
||||
constexpr char kBlockingScansForDlpAndMalware[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp", "malware"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1
|
||||
})";
|
||||
|
||||
constexpr char kBlockingScansForDlp[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1
|
||||
})";
|
||||
|
||||
constexpr char kBlockingScansForDlpAndMalwareWithCustomMessage[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp", "malware"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1,
|
||||
"custom_messages": [{
|
||||
"message": "Custom message",
|
||||
"learn_more_url": "http://www.example.com/",
|
||||
"tag": "dlp"
|
||||
}]
|
||||
})";
|
||||
|
||||
std::string text() {
|
||||
return std::string(100, 'a');
|
||||
}
|
||||
|
||||
// Tests the behavior of the dialog in the following ways:
|
||||
// - It shows the appropriate buttons depending on its state.
|
||||
// - It transitions from states in the correct order.
|
||||
@ -329,6 +278,57 @@ class ContentAnalysisDialogBehaviorBrowserTest
|
||||
views::test::AXEventCounter ax_event_counter_;
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr base::TimeDelta kNoDelay = base::Seconds(0);
|
||||
constexpr base::TimeDelta kSmallDelay = base::Milliseconds(300);
|
||||
constexpr base::TimeDelta kNormalDelay = base::Milliseconds(500);
|
||||
|
||||
constexpr char kBlockingScansForDlpAndMalware[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp", "malware"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1
|
||||
})";
|
||||
|
||||
constexpr char kBlockingScansForDlp[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1
|
||||
})";
|
||||
|
||||
constexpr char kBlockingScansForDlpAndMalwareWithCustomMessage[] = R"(
|
||||
{
|
||||
"service_provider": "google",
|
||||
"enable": [
|
||||
{
|
||||
"url_list": ["*"],
|
||||
"tags": ["dlp", "malware"]
|
||||
}
|
||||
],
|
||||
"block_until_verdict": 1,
|
||||
"custom_messages": [{
|
||||
"message": "Custom message",
|
||||
"learn_more_url": "http://www.example.com/",
|
||||
"tag": "dlp"
|
||||
}]
|
||||
})";
|
||||
|
||||
std::string text() {
|
||||
return std::string(100, 'a');
|
||||
}
|
||||
|
||||
// Tests the behavior of the dialog in the following ways:
|
||||
// - It closes when the "Cancel" button is clicked.
|
||||
// - It returns a negative verdict on the scanned content.
|
||||
|
@ -26,6 +26,8 @@ bool UserResizeEnabled() {
|
||||
return base::FeatureList::IsEnabled(features::kGlicUserResize);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
class GlicWidgetDelegate : public views::WidgetDelegate {
|
||||
public:
|
||||
GlicWidgetDelegate() {
|
||||
@ -44,7 +46,6 @@ class GlicWidgetDelegate : public views::WidgetDelegate {
|
||||
private:
|
||||
void Destroy() { delete this; }
|
||||
};
|
||||
} // namespace
|
||||
|
||||
void* kGlicWidgetIdentifier = &kGlicWidgetIdentifier;
|
||||
|
||||
|
@ -247,7 +247,7 @@ void AppServiceShelfContextMenu::ExecuteCommand(int command_id,
|
||||
const bool scaled = command_id == ash::CROSTINI_USE_LOW_DENSITY;
|
||||
registry_service->SetAppScaled(item().id.app_id, scaled);
|
||||
if (controller()->IsOpen(item().id)) {
|
||||
crostini::ShowAppRestartDialog(display_id());
|
||||
crostini::AppRestartDialog::Show(display_id());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -41,8 +41,6 @@ namespace views::borealis {
|
||||
|
||||
namespace {
|
||||
|
||||
using AllowStatus = ::borealis::BorealisFeatures::AllowStatus;
|
||||
|
||||
using MaybeAction = std::optional<std::pair<std::u16string, base::OnceClosure>>;
|
||||
|
||||
// Views uses tricks like this to ensure singleton-ness of dialogs.
|
||||
@ -62,6 +60,88 @@ class BehaviourProvider {
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
class BorealisDisallowedDialog : public DialogDelegate {
|
||||
public:
|
||||
BorealisDisallowedDialog(std::unique_ptr<BehaviourProvider> behaviour,
|
||||
int title_id) {
|
||||
DCHECK(!g_instance_);
|
||||
|
||||
SetTitle(IDS_BOREALIS_INSTALLER_APP_NAME);
|
||||
set_internal_name("BorealisDisallowedDialog");
|
||||
MaybeAction second_action = behaviour->GetAction();
|
||||
if (second_action.has_value()) {
|
||||
SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk) |
|
||||
static_cast<int>(ui::mojom::DialogButton::kCancel));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kCancel,
|
||||
l10n_util::GetStringUTF16(IDS_CLOSE));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kOk,
|
||||
std::move(second_action.value().first));
|
||||
SetAcceptCallback(std::move(second_action.value().second));
|
||||
} else {
|
||||
SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kOk,
|
||||
l10n_util::GetStringUTF16(IDS_CLOSE));
|
||||
}
|
||||
InitializeView(*behaviour, title_id);
|
||||
SetModalType(ui::mojom::ModalType::kSystem);
|
||||
SetOwnedByWidget(true);
|
||||
SetShowCloseButton(false);
|
||||
set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
|
||||
views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));
|
||||
}
|
||||
|
||||
~BorealisDisallowedDialog() override {
|
||||
DCHECK(g_instance_);
|
||||
g_instance_ = nullptr;
|
||||
}
|
||||
|
||||
bool ShouldShowWindowTitle() const override { return false; }
|
||||
|
||||
private:
|
||||
void InitializeView(const BehaviourProvider& behaviour, int title_id) {
|
||||
auto view = std::make_unique<views::View>();
|
||||
|
||||
views::LayoutProvider* provider = views::LayoutProvider::Get();
|
||||
view->SetLayoutManager(std::make_unique<views::BoxLayout>(
|
||||
views::BoxLayout::Orientation::kVertical,
|
||||
provider->GetInsetsMetric(views::InsetsMetric::INSETS_DIALOG),
|
||||
provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));
|
||||
|
||||
views::Label* title_label = new views::Label(
|
||||
l10n_util::GetStringUTF16(title_id), CONTEXT_IPH_BUBBLE_TITLE,
|
||||
views::style::STYLE_EMPHASIZED);
|
||||
title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
title_label->SetMultiLine(true);
|
||||
view->AddChildViewRaw(title_label);
|
||||
|
||||
views::Label* message_label = new views::Label(behaviour.GetMessage());
|
||||
message_label->SetMultiLine(true);
|
||||
message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
view->AddChildViewRaw(message_label);
|
||||
|
||||
for (const std::pair<std::u16string, GURL>& link : behaviour.GetLinks()) {
|
||||
views::Link* link_label =
|
||||
view->AddChildView(std::make_unique<views::Link>(link.first));
|
||||
link_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
link_label->SetCallback(base::BindRepeating(
|
||||
[](GURL url) {
|
||||
ash::NewWindowDelegate::GetPrimary()->OpenUrl(
|
||||
url, ash::NewWindowDelegate::OpenUrlFrom::kUserInteraction,
|
||||
ash::NewWindowDelegate::Disposition::kNewForegroundTab);
|
||||
},
|
||||
link.second));
|
||||
}
|
||||
|
||||
SetContentsView(std::move(view));
|
||||
}
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
using AllowStatus = ::borealis::BorealisFeatures::AllowStatus;
|
||||
|
||||
class DisallowedHardware : public BehaviourProvider {
|
||||
public:
|
||||
std::u16string GetMessage() const override {
|
||||
@ -143,82 +223,6 @@ class DisallowedFlag : public BehaviourProvider {
|
||||
}
|
||||
};
|
||||
|
||||
class BorealisDisallowedDialog : public DialogDelegate {
|
||||
public:
|
||||
BorealisDisallowedDialog(std::unique_ptr<BehaviourProvider> behaviour,
|
||||
int title_id) {
|
||||
DCHECK(!g_instance_);
|
||||
|
||||
SetTitle(IDS_BOREALIS_INSTALLER_APP_NAME);
|
||||
set_internal_name("BorealisDisallowedDialog");
|
||||
MaybeAction second_action = behaviour->GetAction();
|
||||
if (second_action.has_value()) {
|
||||
SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk) |
|
||||
static_cast<int>(ui::mojom::DialogButton::kCancel));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kCancel,
|
||||
l10n_util::GetStringUTF16(IDS_CLOSE));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kOk,
|
||||
std::move(second_action.value().first));
|
||||
SetAcceptCallback(std::move(second_action.value().second));
|
||||
} else {
|
||||
SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk));
|
||||
SetButtonLabel(ui::mojom::DialogButton::kOk,
|
||||
l10n_util::GetStringUTF16(IDS_CLOSE));
|
||||
}
|
||||
InitializeView(*behaviour, title_id);
|
||||
SetModalType(ui::mojom::ModalType::kSystem);
|
||||
SetOwnedByWidget(true);
|
||||
SetShowCloseButton(false);
|
||||
set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
|
||||
views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));
|
||||
}
|
||||
|
||||
~BorealisDisallowedDialog() override {
|
||||
DCHECK(g_instance_);
|
||||
g_instance_ = nullptr;
|
||||
}
|
||||
|
||||
bool ShouldShowWindowTitle() const override { return false; }
|
||||
|
||||
private:
|
||||
void InitializeView(const BehaviourProvider& behaviour, int title_id) {
|
||||
auto view = std::make_unique<views::View>();
|
||||
|
||||
views::LayoutProvider* provider = views::LayoutProvider::Get();
|
||||
view->SetLayoutManager(std::make_unique<views::BoxLayout>(
|
||||
views::BoxLayout::Orientation::kVertical,
|
||||
provider->GetInsetsMetric(views::InsetsMetric::INSETS_DIALOG),
|
||||
provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));
|
||||
|
||||
views::Label* title_label = new views::Label(
|
||||
l10n_util::GetStringUTF16(title_id), CONTEXT_IPH_BUBBLE_TITLE,
|
||||
views::style::STYLE_EMPHASIZED);
|
||||
title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
title_label->SetMultiLine(true);
|
||||
view->AddChildViewRaw(title_label);
|
||||
|
||||
views::Label* message_label = new views::Label(behaviour.GetMessage());
|
||||
message_label->SetMultiLine(true);
|
||||
message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
view->AddChildViewRaw(message_label);
|
||||
|
||||
for (const std::pair<std::u16string, GURL>& link : behaviour.GetLinks()) {
|
||||
views::Link* link_label =
|
||||
view->AddChildView(std::make_unique<views::Link>(link.first));
|
||||
link_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
||||
link_label->SetCallback(base::BindRepeating(
|
||||
[](GURL url) {
|
||||
ash::NewWindowDelegate::GetPrimary()->OpenUrl(
|
||||
url, ash::NewWindowDelegate::OpenUrlFrom::kUserInteraction,
|
||||
ash::NewWindowDelegate::Disposition::kNewForegroundTab);
|
||||
},
|
||||
link.second));
|
||||
}
|
||||
|
||||
SetContentsView(std::move(view));
|
||||
}
|
||||
};
|
||||
|
||||
std::unique_ptr<BehaviourProvider> StatusBehaviour(AllowStatus status) {
|
||||
switch (status) {
|
||||
case AllowStatus::kAllowed:
|
||||
|
@ -40,6 +40,8 @@ namespace {
|
||||
// Views uses tricks like this to ensure singleton-ness of dialogs.
|
||||
static Widget* g_instance_ = nullptr;
|
||||
|
||||
} // namespace
|
||||
|
||||
class BorealisLaunchErrorDialog : public DialogDelegate {
|
||||
public:
|
||||
explicit BorealisLaunchErrorDialog(Profile* profile,
|
||||
@ -215,7 +217,6 @@ class BorealisLaunchErrorDialog : public DialogDelegate {
|
||||
FailureType failure_;
|
||||
raw_ptr<views::Checkbox> feedback_checkbox_ = nullptr;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
void ShowBorealisLaunchErrorView(Profile* profile,
|
||||
BorealisStartupResult error) {
|
||||
|
@ -26,7 +26,29 @@ gfx::NativeWindow GetNativeWindowFromDisplayId(int64_t display_id) {
|
||||
return screen->GetWindowAtScreenPoint(display.bounds().origin());
|
||||
}
|
||||
|
||||
std::unique_ptr<views::View> MakeCrostiniAppRestartView() {
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
void AppRestartDialog::Show(int64_t display_id) {
|
||||
ShowInternal(GetNativeWindowFromDisplayId(display_id));
|
||||
}
|
||||
|
||||
// static
|
||||
void AppRestartDialog::ShowForTesting(gfx::NativeWindow context) {
|
||||
ShowInternal(context);
|
||||
}
|
||||
|
||||
// static
|
||||
void AppRestartDialog::ShowInternal(gfx::NativeWindow context) {
|
||||
auto contents = MakeCrostiniAppRestartView();
|
||||
auto delegate = MakeCrostiniAppRestartDelegate(std::move(contents));
|
||||
views::DialogDelegate::CreateDialogWidget(std::move(delegate), context,
|
||||
nullptr)
|
||||
->Show();
|
||||
}
|
||||
|
||||
// static
|
||||
std::unique_ptr<views::View> AppRestartDialog::MakeCrostiniAppRestartView() {
|
||||
auto view = std::make_unique<views::View>();
|
||||
|
||||
views::LayoutProvider* provider = views::LayoutProvider::Get();
|
||||
@ -45,7 +67,9 @@ std::unique_ptr<views::View> MakeCrostiniAppRestartView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
std::unique_ptr<views::DialogDelegate> MakeCrostiniAppRestartDelegate(
|
||||
// static
|
||||
std::unique_ptr<views::DialogDelegate>
|
||||
AppRestartDialog::MakeCrostiniAppRestartDelegate(
|
||||
std::unique_ptr<views::View> contents) {
|
||||
auto delegate = std::make_unique<views::DialogDelegate>();
|
||||
delegate->set_internal_name("CrostiniAppRestart");
|
||||
@ -60,22 +84,4 @@ std::unique_ptr<views::DialogDelegate> MakeCrostiniAppRestartDelegate(
|
||||
return delegate;
|
||||
}
|
||||
|
||||
void ShowInternal(gfx::NativeWindow context) {
|
||||
auto contents = MakeCrostiniAppRestartView();
|
||||
auto delegate = MakeCrostiniAppRestartDelegate(std::move(contents));
|
||||
views::DialogDelegate::CreateDialogWidget(std::move(delegate), context,
|
||||
nullptr)
|
||||
->Show();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void ShowAppRestartDialog(int64_t display_id) {
|
||||
ShowInternal(GetNativeWindowFromDisplayId(display_id));
|
||||
}
|
||||
|
||||
void ShowAppRestartDialogForTesting(gfx::NativeWindow context) {
|
||||
ShowInternal(context);
|
||||
}
|
||||
|
||||
} // namespace crostini
|
||||
|
@ -5,12 +5,28 @@
|
||||
#ifndef CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_APP_RESTART_DIALOG_H_
|
||||
#define CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_APP_RESTART_DIALOG_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "ui/gfx/native_widget_types.h"
|
||||
|
||||
namespace views {
|
||||
class DialogDelegate;
|
||||
class View;
|
||||
} // namespace views
|
||||
|
||||
namespace crostini {
|
||||
|
||||
void ShowAppRestartDialog(int64_t display_id);
|
||||
void ShowAppRestartDialogForTesting(gfx::NativeWindow context);
|
||||
class AppRestartDialog {
|
||||
public:
|
||||
static void Show(int64_t display_id);
|
||||
static void ShowForTesting(gfx::NativeWindow context);
|
||||
|
||||
private:
|
||||
static void ShowInternal(gfx::NativeWindow context);
|
||||
static std::unique_ptr<views::View> MakeCrostiniAppRestartView();
|
||||
static std::unique_ptr<views::DialogDelegate> MakeCrostiniAppRestartDelegate(
|
||||
std::unique_ptr<views::View> contents);
|
||||
};
|
||||
|
||||
} // namespace crostini
|
||||
|
||||
|
@ -20,7 +20,7 @@ class CrostiniAppRestartDialogTest : public ChromeViewsTestBase {
|
||||
views::test::WidgetTest::WidgetAutoclosePtr ShowDialog() {
|
||||
views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
|
||||
"CrostiniAppRestart");
|
||||
crostini::ShowAppRestartDialogForTesting(GetContext());
|
||||
crostini::AppRestartDialog::ShowForTesting(GetContext());
|
||||
return views::test::WidgetTest::WidgetAutoclosePtr(
|
||||
waiter.WaitIfNeededAndGet());
|
||||
}
|
||||
|
@ -33,13 +33,13 @@
|
||||
#include "ui/views/view.h"
|
||||
#include "ui/views/window/dialog_client_view.h"
|
||||
|
||||
namespace {
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::Return;
|
||||
using ::testing::ReturnRefOfCopy;
|
||||
|
||||
namespace {
|
||||
|
||||
class MockDownloadBubbleNavigationHandler
|
||||
: public DownloadBubbleNavigationHandler {
|
||||
public:
|
||||
@ -90,6 +90,8 @@ std::unique_ptr<KeyedService> BuildMockDownloadCoreService(
|
||||
return std::make_unique<MockDownloadCoreService>();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
class DownloadBubbleContentsViewTest
|
||||
: public ChromeViewsTestBase,
|
||||
public ::testing::WithParamInterface<bool> {
|
||||
@ -433,5 +435,3 @@ TEST_P(DownloadBubbleContentsViewTest,
|
||||
OfflineItemUtils::GetContentIdForDownload(download_items_[0].get()),
|
||||
DownloadCommands::Command::DISCARD);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
@ -33,10 +33,6 @@
|
||||
|
||||
using content::WebContents;
|
||||
|
||||
namespace {
|
||||
|
||||
const int kMessageWidth = 400;
|
||||
|
||||
// The external protocol dialog for Chrome OS shown when we have a URL with a
|
||||
// Tel scheme but there are no handlers.
|
||||
class ExternalProtocolNoHandlersTelSchemeDialog : public views::DialogDelegate {
|
||||
@ -53,7 +49,7 @@ class ExternalProtocolNoHandlersTelSchemeDialog : public views::DialogDelegate {
|
||||
l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_CLOSE_BUTTON_TEXT));
|
||||
|
||||
message_box_view_ = new views::MessageBoxView();
|
||||
message_box_view_->SetMessageWidth(kMessageWidth);
|
||||
message_box_view_->SetMessageWidth(400);
|
||||
|
||||
views::DialogDelegate::CreateDialogWidget(this, nullptr, parent_window)
|
||||
->Show();
|
||||
@ -121,8 +117,6 @@ void OnArcHandled(const GURL& url,
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ExternalProtocolHandler
|
||||
|
||||
|
@ -97,6 +97,8 @@ BEGIN_METADATA(NotificationBarClientView)
|
||||
ADD_PROPERTY_METADATA(gfx::Rect, ClientRect)
|
||||
END_METADATA
|
||||
|
||||
} // namespace
|
||||
|
||||
class ScreenCaptureNotificationUIViews : public views::WidgetDelegateView,
|
||||
public views::ViewObserver {
|
||||
METADATA_HEADER(ScreenCaptureNotificationUIViews, views::WidgetDelegateView)
|
||||
@ -139,34 +141,6 @@ class ScreenCaptureNotificationUIViews : public views::WidgetDelegateView,
|
||||
raw_ptr<views::View> hide_link_ = nullptr;
|
||||
};
|
||||
|
||||
// ScreenCaptureNotificationUI implementation using Views.
|
||||
class ScreenCaptureNotificationUIImpl : public ScreenCaptureNotificationUI {
|
||||
public:
|
||||
ScreenCaptureNotificationUIImpl(const std::u16string& text,
|
||||
content::WebContents* capturing_web_contents);
|
||||
ScreenCaptureNotificationUIImpl(const ScreenCaptureNotificationUIImpl&) =
|
||||
delete;
|
||||
ScreenCaptureNotificationUIImpl& operator=(
|
||||
const ScreenCaptureNotificationUIImpl&) = delete;
|
||||
~ScreenCaptureNotificationUIImpl() override = default;
|
||||
|
||||
// ScreenCaptureNotificationUI override:
|
||||
gfx::NativeViewId OnStarted(
|
||||
base::OnceClosure stop_callback,
|
||||
content::MediaStreamUI::SourceCallback source_callback,
|
||||
const std::vector<content::DesktopMediaID>& media_ids) override;
|
||||
|
||||
private:
|
||||
// Helper to set window id to parent browser window id for task bar grouping.
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
void SetWindowsAppId(views::Widget* widget);
|
||||
#endif
|
||||
|
||||
std::u16string text_;
|
||||
base::WeakPtr<content::WebContents> capturing_web_contents_;
|
||||
std::unique_ptr<views::Widget> widget_;
|
||||
};
|
||||
|
||||
ScreenCaptureNotificationUIViews::ScreenCaptureNotificationUIViews(
|
||||
const std::u16string& text,
|
||||
content::WebContents* capturing_web_contents,
|
||||
@ -300,6 +274,36 @@ void ScreenCaptureNotificationUIViews::NotifyStopped() {
|
||||
BEGIN_METADATA(ScreenCaptureNotificationUIViews)
|
||||
END_METADATA
|
||||
|
||||
namespace {
|
||||
|
||||
// ScreenCaptureNotificationUI implementation using Views.
|
||||
class ScreenCaptureNotificationUIImpl : public ScreenCaptureNotificationUI {
|
||||
public:
|
||||
ScreenCaptureNotificationUIImpl(const std::u16string& text,
|
||||
content::WebContents* capturing_web_contents);
|
||||
ScreenCaptureNotificationUIImpl(const ScreenCaptureNotificationUIImpl&) =
|
||||
delete;
|
||||
ScreenCaptureNotificationUIImpl& operator=(
|
||||
const ScreenCaptureNotificationUIImpl&) = delete;
|
||||
~ScreenCaptureNotificationUIImpl() override = default;
|
||||
|
||||
// ScreenCaptureNotificationUI override:
|
||||
gfx::NativeViewId OnStarted(
|
||||
base::OnceClosure stop_callback,
|
||||
content::MediaStreamUI::SourceCallback source_callback,
|
||||
const std::vector<content::DesktopMediaID>& media_ids) override;
|
||||
|
||||
private:
|
||||
// Helper to set window id to parent browser window id for task bar grouping.
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
void SetWindowsAppId(views::Widget* widget);
|
||||
#endif
|
||||
|
||||
std::u16string text_;
|
||||
base::WeakPtr<content::WebContents> capturing_web_contents_;
|
||||
std::unique_ptr<views::Widget> widget_;
|
||||
};
|
||||
|
||||
ScreenCaptureNotificationUIImpl::ScreenCaptureNotificationUIImpl(
|
||||
const std::u16string& text,
|
||||
content::WebContents* capturing_web_contents)
|
||||
|
@ -66,6 +66,8 @@ class WidgetResizeWaiter : public views::WidgetObserver {
|
||||
base::RunLoop run_loop_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
class WebDialogBrowserTest : public InProcessBrowserTest {
|
||||
public:
|
||||
WebDialogBrowserTest() = default;
|
||||
@ -123,8 +125,6 @@ void WebDialogBrowserTest::SimulateEscapeKey() {
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Windows has some issues resizing windows. An off by one problem, and a
|
||||
// minimum size that seems too big. See http://crbug.com/52602.
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
|
@ -32,16 +32,6 @@ using TokenError = content::IdentityCredentialTokenError;
|
||||
using DismissReason = content::IdentityRequestDialogController::DismissReason;
|
||||
class FedCmAccountSelectionViewDesktopTest;
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr char kTopFrameEtldPlusOne[] = "top-frame-example.com";
|
||||
constexpr char kIdpEtldPlusOne[] = "idp-example.com";
|
||||
constexpr char kConfigUrl[] = "https://idp-example.com/fedcm.json";
|
||||
constexpr char kLoginUrl[] = "https://idp-example.com/login";
|
||||
|
||||
constexpr char kAccountId1[] = "account_id1";
|
||||
constexpr char kAccountId2[] = "account_id2";
|
||||
|
||||
// Mock AccountSelectionViewBase which tracks state.
|
||||
class TestAccountSelectionView : public AccountSelectionViewBase,
|
||||
public views::WidgetDelegate {
|
||||
@ -127,6 +117,16 @@ class TestAccountSelectionView : public AccountSelectionViewBase,
|
||||
std::vector<std::string> account_ids_;
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr char kTopFrameEtldPlusOne[] = "top-frame-example.com";
|
||||
constexpr char kIdpEtldPlusOne[] = "idp-example.com";
|
||||
constexpr char kConfigUrl[] = "https://idp-example.com/fedcm.json";
|
||||
constexpr char kLoginUrl[] = "https://idp-example.com/login";
|
||||
|
||||
constexpr char kAccountId1[] = "account_id1";
|
||||
constexpr char kAccountId2[] = "account_id2";
|
||||
|
||||
// Mock version of FedCmModalDialogView for injection during tests.
|
||||
class MockFedCmModalDialogView : public FedCmModalDialogView {
|
||||
public:
|
||||
|
@ -693,6 +693,8 @@ DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(LastHoverEventObserver, kHoverView3State);
|
||||
BEGIN_METADATA(HoverDetectionView)
|
||||
END_METADATA
|
||||
|
||||
} // namespace
|
||||
|
||||
class HoverDetectionBubbleView : public views::FlexLayoutView,
|
||||
public views::BubbleDialogDelegate {
|
||||
METADATA_HEADER(HoverDetectionBubbleView, views::FlexLayoutView)
|
||||
@ -730,8 +732,6 @@ class HoverDetectionBubbleView : public views::FlexLayoutView,
|
||||
BEGIN_METADATA(HoverDetectionBubbleView)
|
||||
END_METADATA
|
||||
|
||||
} // namespace
|
||||
|
||||
class InteractiveBrowserTestHoverUiTest : public InteractiveBrowserTestUiTest {
|
||||
public:
|
||||
InteractiveBrowserTestHoverUiTest() = default;
|
||||
|
@ -78,6 +78,8 @@ class TestFocusRules : public wm::BaseFocusRules {
|
||||
bool can_activate_ = true;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
class NativeWidgetAuraTest : public ViewsTestBase {
|
||||
public:
|
||||
NativeWidgetAuraTest() = default;
|
||||
@ -1125,5 +1127,4 @@ TEST_F(NativeWidgetAuraWithNoDelegateTest, UpdateVisualStateTest) {
|
||||
native_widget_->UpdateVisualState();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace views
|
||||
|
Reference in New Issue
Block a user