blob: 690e11c32c86c5b99d398c1f9ffb7fbe081cdb34 [file] [log] [blame]
// Copyright 2022 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/ui/extensions/settings_overridden_dialog.h"
#include "chrome/browser/ui/extensions/extension_dialog_utils.h"
#include "chrome/browser/ui/extensions/settings_overridden_dialog_controller.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/dialog_model.h"
#include "ui/base/models/image_model.h"
#include "ui/color/color_id.h"
#include "ui/gfx/paint_vector_icon.h"
using DialogResult = SettingsOverriddenDialogController::DialogResult;
namespace {
constexpr int kDialogHeaderIconSize = 20;
// Model delegate that notifies the `controller_` when a click event occurs in
// the settings overridden dialog.
class SettingsOverriddenDialogDelegate : public ui::DialogModelDelegate {
public:
explicit SettingsOverriddenDialogDelegate(
std::unique_ptr<SettingsOverriddenDialogController> controller)
: controller_(std::move(controller)) {}
void OnDialogAccepted() {
HandleDialogResult(DialogResult::kChangeSettingsBack);
}
void OnDialogCancelled() {
HandleDialogResult(DialogResult::kKeepNewSettings);
}
void OnDialogClosed() { HandleDialogResult(DialogResult::kDialogDismissed); }
void OnDialogDestroyed() {
if (!result_) {
// The dialog may close without firing any of the [accept | cancel |
// close] callbacks if e.g. the parent window closes. In this case, notify
// the controller that the dialog closed without user action.
HandleDialogResult(DialogResult::kDialogClosedWithoutUserAction);
}
}
SettingsOverriddenDialogController* controller() { return controller_.get(); }
private:
void HandleDialogResult(DialogResult result) {
DCHECK(!result_)
<< "Trying to re-notify controller of result. Previous result: "
<< static_cast<int>(*result_)
<< ", new result: " << static_cast<int>(result);
result_ = result;
controller_->HandleDialogResult(result);
}
std::unique_ptr<SettingsOverriddenDialogController> controller_;
std::optional<DialogResult> result_;
};
} // namespace
namespace extensions {
void ShowSettingsOverriddenDialog(
std::unique_ptr<SettingsOverriddenDialogController> controller,
gfx::NativeWindow parent) {
SettingsOverriddenDialogController::ShowParams show_params =
controller->GetShowParams();
auto dialog_delegate_unique =
std::make_unique<SettingsOverriddenDialogDelegate>(std::move(controller));
SettingsOverriddenDialogDelegate* dialog_delegate =
dialog_delegate_unique.get();
ui::DialogModel::Builder dialog_builder =
ui::DialogModel::Builder(std::move(dialog_delegate_unique));
dialog_builder.SetInternalName(kExtensionSettingsOverriddenDialogName)
.SetTitle(show_params.dialog_title)
.AddParagraph(ui::DialogModelLabel(show_params.message))
.AddOkButton(
base::BindOnce(&SettingsOverriddenDialogDelegate::OnDialogAccepted,
base::Unretained(dialog_delegate)),
ui::DialogModel::Button::Params().SetLabel(l10n_util::GetStringUTF16(
IDS_EXTENSION_SETTINGS_OVERRIDDEN_DIALOG_CHANGE_IT_BACK)))
.AddCancelButton(
base::BindOnce(&SettingsOverriddenDialogDelegate::OnDialogCancelled,
base::Unretained(dialog_delegate)),
ui::DialogModel::Button::Params().SetLabel(l10n_util::GetStringUTF16(
IDS_EXTENSION_SETTINGS_OVERRIDDEN_DIALOG_KEEP_IT)))
.SetCloseActionCallback(
base::BindOnce(&SettingsOverriddenDialogDelegate::OnDialogClosed,
base::Unretained(dialog_delegate)))
.SetDialogDestroyingCallback(
base::BindOnce(&SettingsOverriddenDialogDelegate::OnDialogDestroyed,
base::Unretained(dialog_delegate)))
.OverrideShowCloseButton(false);
if (show_params.icon) {
dialog_builder.SetIcon(ui::ImageModel::FromVectorIcon(
// TODO(crbug.com/439918265): Align on a single icon size for extension
// dialogs and use such variable here.
*show_params.icon, ui::kColorIcon, kDialogHeaderIconSize));
}
ShowModalDialog(parent, dialog_builder.Build());
dialog_delegate->controller()->OnDialogShown();
}
} // namespace extensions