Skip to content

Commit

Permalink
dlp: Split block and warn files dialogs
Browse files Browse the repository at this point in the history
Splits FilesPolicyDialog into two subclasses for warning and block
restriction levels, i.e. warning or error dialogs. The warning dialog
can only be shown for a single policy at a time, while the error dialog
can combine blocked files from both DLP and Enterprise Connectors.

Currently only the constructors and some methods are extracted to the
child classes, but in the future more of the setup will be moved from
the base, which will only handle setting up the views etc, as the text
used in the dialog should depend on its type.

R=ayaelattar@chromium.org

Fixed: b:284287312
Change-Id: If2df288f0fed7b10b227afe77ec3dc58ba684eef
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4570510
Reviewed-by: Aya Elsayed <ayaelattar@chromium.org>
Commit-Queue: Aya Elsayed <ayaelattar@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1150522}
  • Loading branch information
Aida Zolic authored and Chromium LUCI CQ committed May 30, 2023
1 parent dfa0a85 commit ba37e3c
Show file tree
Hide file tree
Showing 9 changed files with 250 additions and 114 deletions.
27 changes: 22 additions & 5 deletions chrome/browser/ash/policy/dlp/files_policy_notification_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#include "chrome/browser/ash/file_manager/url_util.h"
#include "chrome/browser/ash/file_manager/volume_manager.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_error_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_warn_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_utils.h"
#include "chrome/browser/profiles/profile.h"
Expand Down Expand Up @@ -121,11 +123,26 @@ void FilesPolicyNotificationManager::ShowFilesPolicyDialog(
gfx::NativeWindow modal_parent) {
// TODO(b/282664769): Pass correct values. These should be stored by
// task_id.
views::Widget* widget = views::DialogDelegate::CreateDialogWidget(
std::make_unique<FilesPolicyDialog>(
base::DoNothing(), std::vector<DlpConfidentialFile>(),
DlpFileDestination(""), dlp::FileAction::kCopy, modal_parent),
/*context=*/nullptr, /*parent=*/modal_parent);
views::Widget* widget;
switch (type) {
case FilesDialogType::kUnknown:
LOG(WARNING) << "Unknown FilesDialogType passed";
return;
case FilesDialogType::kWarning:
widget = views::DialogDelegate::CreateDialogWidget(
std::make_unique<FilesPolicyWarnDialog>(
base::DoNothing(), std::vector<DlpConfidentialFile>(),
DlpFileDestination(""), dlp::FileAction::kCopy, modal_parent),
/*context=*/nullptr, /*parent=*/modal_parent);
break;
case FilesDialogType::kError:
widget = views::DialogDelegate::CreateDialogWidget(
std::make_unique<FilesPolicyErrorDialog>(
std::map<DlpConfidentialFile, Policy>(), DlpFileDestination(""),
dlp::FileAction::kCopy, modal_parent),
/*context=*/nullptr, /*parent=*/modal_parent);
break;
}
widget->Show();
// TODO(ayaelattar): Timeout after total 5 minutes.
}
Expand Down
4 changes: 4 additions & 0 deletions chrome/browser/chromeos/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ source_set("chromeos") {
"policy/dlp/dialogs/dlp_warn_notifier.h",
"policy/dlp/dialogs/files_policy_dialog.cc",
"policy/dlp/dialogs/files_policy_dialog.h",
"policy/dlp/dialogs/files_policy_error_dialog.cc",
"policy/dlp/dialogs/files_policy_error_dialog.h",
"policy/dlp/dialogs/files_policy_warn_dialog.cc",
"policy/dlp/dialogs/files_policy_warn_dialog.h",
"policy/dlp/dialogs/policy_dialog_base.cc",
"policy/dlp/dialogs/policy_dialog_base.h",
"policy/dlp/dlp_clipboard_bubble_constants.h",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

#include "base/containers/cxx20_erase.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/dlp_warn_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_warn_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/policy_dialog_base.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_controller.h"
Expand Down Expand Up @@ -74,9 +74,9 @@ base::WeakPtr<views::Widget> DlpWarnNotifier::ShowDlpFilesWarningDialog(
const DlpFileDestination& destination,
dlp::FileAction action) {
views::Widget* widget = views::DialogDelegate::CreateDialogWidget(
std::make_unique<FilesPolicyDialog>(std::move(callback),
confidential_files, destination,
action, /*parent=*/nullptr),
std::make_unique<FilesPolicyWarnDialog>(std::move(callback),
confidential_files, destination,
action, /*parent=*/nullptr),
/*context=*/nullptr, /*parent=*/nullptr);
ShowWidget(widget);
return widget->GetWeakPtr();
Expand Down
89 changes: 11 additions & 78 deletions chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -79,68 +79,21 @@ const std::u16string GetDestination(DlpFileDestination destination) {
}
} // namespace

FilesPolicyDialog::FilesPolicyDialog(
OnDlpRestrictionCheckedCallback callback,
const std::vector<DlpConfidentialFile>& files,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent)
: type_(FilesDialogType::kWarning), // default
policy_(Policy::kDlp), // default
files_(std::move(files)),
destination_(destination),
action_(action) {
SetOnDlpRestrictionCheckedCallback(std::move(callback));
SetModalType(ui::MODAL_TYPE_SYSTEM);

SetButtonLabel(ui::DIALOG_BUTTON_OK, GetOkButton());
SetButtonLabel(ui::DialogButton::DIALOG_BUTTON_CANCEL, GetCancelButton());

AddGeneralInformation();
MaybeAddConfidentialRows();
}

FilesPolicyDialog::FilesPolicyDialog(
FilesDialogType type,
absl::optional<Policy> policy,
absl::optional<OnDlpRestrictionCheckedCallback> callback,
const std::vector<DlpConfidentialFile>& files,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent)
: type_(type),
policy_(policy),
files_(std::move(files)),
destination_(destination),
action_(action) {
FilesPolicyDialog::FilesPolicyDialog(size_t file_count,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent)
: destination_(destination), action_(action), file_count_(file_count) {
// TODO(b/279397364): Confirm behavior if we cannot open Files App.
ui::ModalType modal =
modal_parent ? ui::MODAL_TYPE_WINDOW : ui::MODAL_TYPE_SYSTEM;
SetModalType(modal);

switch (type_) {
case FilesDialogType::kWarning:
DCHECK(policy.has_value());
DCHECK(callback.has_value());
SetOnDlpRestrictionCheckedCallback(std::move(callback.value()));
break;
case FilesDialogType::kError:
SetAcceptCallback(base::BindOnce(&FilesPolicyDialog::Dismiss,
weak_factory_.GetWeakPtr()));
SetCancelCallback(base::BindOnce(&FilesPolicyDialog::OpenHelpPage,
weak_factory_.GetWeakPtr()));
break;
default:
NOTREACHED();
break;
}

// TODO(b/283786807): Use type & policy for computing the strings.
SetButtonLabel(ui::DIALOG_BUTTON_OK, GetOkButton());
SetButtonLabel(ui::DialogButton::DIALOG_BUTTON_CANCEL, GetCancelButton());

AddGeneralInformation();
MaybeAddConfidentialRows();
}

FilesPolicyDialog::~FilesPolicyDialog() = default;
Expand All @@ -149,17 +102,6 @@ void FilesPolicyDialog::AddGeneralInformation() {
SetupUpperPanel(GetTitle(), GetMessage());
}

void FilesPolicyDialog::MaybeAddConfidentialRows() {
if (files_.empty()) {
return;
}

SetupScrollView();
for (const DlpConfidentialFile& file : files_) {
AddConfidentialRow(file.icon, file.title);
}
}

std::u16string FilesPolicyDialog::GetOkButton() {
switch (action_) {
case dlp::FileAction::kDownload:
Expand Down Expand Up @@ -198,23 +140,23 @@ std::u16string FilesPolicyDialog::GetTitle() {
IDS_POLICY_DLP_FILES_DOWNLOAD_WARN_TITLE, 1);
case dlp::FileAction::kUpload:
return l10n_util::GetPluralStringFUTF16(
IDS_POLICY_DLP_FILES_UPLOAD_WARN_TITLE, files_.size());
IDS_POLICY_DLP_FILES_UPLOAD_WARN_TITLE, file_count_);
case dlp::FileAction::kCopy:
return l10n_util::GetPluralStringFUTF16(
IDS_POLICY_DLP_FILES_COPY_WARN_TITLE, files_.size());
IDS_POLICY_DLP_FILES_COPY_WARN_TITLE, file_count_);
case dlp::FileAction::kMove:
return l10n_util::GetPluralStringFUTF16(
IDS_POLICY_DLP_FILES_MOVE_WARN_TITLE, files_.size());
IDS_POLICY_DLP_FILES_MOVE_WARN_TITLE, file_count_);
case dlp::FileAction::kOpen:
case dlp::FileAction::kShare:
return l10n_util::GetPluralStringFUTF16(
IDS_POLICY_DLP_FILES_OPEN_WARN_TITLE, files_.size());
IDS_POLICY_DLP_FILES_OPEN_WARN_TITLE, file_count_);
case dlp::FileAction::kTransfer:
case dlp::FileAction::kUnknown: // TODO(crbug.com/1361900)
// Set proper text when file
// action is unknown
return l10n_util::GetPluralStringFUTF16(
IDS_POLICY_DLP_FILES_TRANSFER_WARN_TITLE, files_.size());
IDS_POLICY_DLP_FILES_TRANSFER_WARN_TITLE, file_count_);
}
}

Expand Down Expand Up @@ -255,20 +197,11 @@ std::u16string FilesPolicyDialog::GetMessage() {
break;
}
return base::ReplaceStringPlaceholders(
l10n_util::GetPluralStringFUTF16(message_id, files_.size()),
l10n_util::GetPluralStringFUTF16(message_id, file_count_),
destination_str,
/*offset=*/nullptr);
}

void FilesPolicyDialog::OpenHelpPage() {
// TODO(b/283786134): Implementation.
}

void FilesPolicyDialog::Dismiss() {
GetWidget()->CloseWithReason(
views::Widget::ClosedReason::kCloseButtonClicked);
}

BEGIN_METADATA(FilesPolicyDialog, PolicyDialogBase)
END_METADATA

Expand Down
34 changes: 7 additions & 27 deletions chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "chrome/browser/chromeos/policy/dlp/dialogs/policy_dialog_base.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_confidential_file.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_controller.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_utils.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/metadata/metadata_header_macros.h"
Expand Down Expand Up @@ -39,47 +38,28 @@ class FilesPolicyDialog : public PolicyDialogBase {
METADATA_HEADER(FilesPolicyDialog);

FilesPolicyDialog() = delete;
// TODO(b/283785160): Remove after migrating to the new UI for files.
FilesPolicyDialog(OnDlpRestrictionCheckedCallback callback,
const std::vector<DlpConfidentialFile>& files,
FilesPolicyDialog(size_t file_count,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent);
// `callback` and `policy` are required only for kWarning `type`.
FilesPolicyDialog(FilesDialogType type,
absl::optional<Policy> policy,
absl::optional<OnDlpRestrictionCheckedCallback> callback,
const std::vector<DlpConfidentialFile>& files,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent);

FilesPolicyDialog(const FilesPolicyDialog& other) = delete;
FilesPolicyDialog& operator=(const FilesPolicyDialog& other) = delete;
~FilesPolicyDialog() override;

protected:
DlpFileDestination destination_;
dlp::FileAction action_;

private:
// PolicyDialogBase overrides:
void AddGeneralInformation() override;
void MaybeAddConfidentialRows() override;
std::u16string GetOkButton() override;
std::u16string GetCancelButton() override;
std::u16string GetTitle() override;
std::u16string GetMessage() override;

// Called from the error dialog's "Cancel" button.
// Opens the help page for policy/-ies that blocked the file action.
void OpenHelpPage();

// Called from the error dialog's "OK" button.
// Dismisses the dialog.
void Dismiss();

FilesDialogType type_;
absl::optional<Policy> policy_;
std::vector<DlpConfidentialFile> files_;
DlpFileDestination destination_;
dlp::FileAction action_;
// Number of files listed in the dialog.
size_t file_count_;

base::WeakPtrFactory<FilesPolicyDialog> weak_factory_{this};
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright 2023 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/chromeos/policy/dlp/dialogs/files_policy_error_dialog.h"

#include "base/functional/callback_helpers.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_utils.h"
#include "ui/base/metadata/metadata_impl_macros.h"

namespace policy {
FilesPolicyErrorDialog::FilesPolicyErrorDialog(
std::map<DlpConfidentialFile, Policy> files,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent)
: FilesPolicyDialog(files.size(),
std::move(destination),
action,
modal_parent),
files_(std::move(files)) {
SetAcceptCallback(base::BindOnce(&FilesPolicyErrorDialog::Dismiss,
weak_factory_.GetWeakPtr()));
SetCancelCallback(base::BindOnce(&FilesPolicyErrorDialog::OpenHelpPage,
weak_factory_.GetWeakPtr()));
MaybeAddConfidentialRows();
}

FilesPolicyErrorDialog::~FilesPolicyErrorDialog() = default;

void FilesPolicyErrorDialog::MaybeAddConfidentialRows() {
if (files_.empty()) {
return;
}

SetupScrollView();
for (const auto& file : files_) {
// TODO(aidazolic): Add errors.
AddConfidentialRow(file.first.icon, file.first.title);
}
}

void FilesPolicyErrorDialog::OpenHelpPage() {
// TODO(b/283786134): Implementation.
}

void FilesPolicyErrorDialog::Dismiss() {
GetWidget()->CloseWithReason(
views::Widget::ClosedReason::kCloseButtonClicked);
}

BEGIN_METADATA(FilesPolicyErrorDialog, FilesPolicyDialog)
END_METADATA

} // namespace policy
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DLP_DIALOGS_FILES_POLICY_ERROR_DIALOG_H_
#define CHROME_BROWSER_CHROMEOS_POLICY_DLP_DIALOGS_FILES_POLICY_ERROR_DIALOG_H_

#include <map>

#include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/policy/dlp/dialogs/files_policy_dialog.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_confidential_file.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_files_utils.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/gfx/native_widget_types.h"

namespace policy {

// FilesPolicyErrorDialog is a window modal dialog used to show detailed
// overview of files blocked by data protection policies.
class FilesPolicyErrorDialog : public FilesPolicyDialog {
public:
METADATA_HEADER(FilesPolicyErrorDialog);

FilesPolicyErrorDialog() = delete;
FilesPolicyErrorDialog(std::map<DlpConfidentialFile, Policy> files,
DlpFileDestination destination,
dlp::FileAction action,
gfx::NativeWindow modal_parent);
FilesPolicyErrorDialog(const FilesPolicyErrorDialog&) = delete;
FilesPolicyErrorDialog(FilesPolicyErrorDialog&&) = delete;
FilesPolicyErrorDialog& operator=(const FilesPolicyErrorDialog&) = delete;
FilesPolicyErrorDialog& operator=(FilesPolicyErrorDialog&&) = delete;
~FilesPolicyErrorDialog() override;

private:
// PolicyDialogBase overrides:
void MaybeAddConfidentialRows() override;

// Called from the dialog's "Cancel" button.
// Opens the help page for policy/-ies that blocked the file action.
void OpenHelpPage();

// Called from the dialog's "OK" button.
// Dismisses the dialog.
void Dismiss();

std::map<DlpConfidentialFile, Policy> files_;

base::WeakPtrFactory<FilesPolicyErrorDialog> weak_factory_{this};
};

} // namespace policy

#endif // CHROME_BROWSER_CHROMEOS_POLICY_DLP_DIALOGS_FILES_POLICY_ERROR_DIALOG_H_

0 comments on commit ba37e3c

Please sign in to comment.