blob: ee59a37f3067e5a680eeb7db49f7e499162729ab [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/javascript_dialogs/javascript_dialog_views.h"
#include "base/memory/ptr_util.h"
#include "components/constrained_window/constrained_window_views.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/controls/message_box_view.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/layout/layout_constants.h"
JavaScriptDialogViews::~JavaScriptDialogViews() = default;
// static
base::WeakPtr<JavaScriptDialogViews> JavaScriptDialogViews::Create(
content::WebContents* parent_web_contents,
content::WebContents* alerting_web_contents,
const base::string16& title,
content::JavaScriptMessageType message_type,
const base::string16& message_text,
const base::string16& default_prompt_text,
const content::JavaScriptDialogManager::DialogClosedCallback&
dialog_callback) {
return (new JavaScriptDialogViews(parent_web_contents, alerting_web_contents,
title, message_type, message_text,
default_prompt_text, dialog_callback))
->weak_factory_.GetWeakPtr();
}
void JavaScriptDialogViews::CloseDialogWithoutCallback() {
dialog_callback_.Reset();
GetWidget()->Close();
}
int JavaScriptDialogViews::GetDefaultDialogButton() const {
return ui::DIALOG_BUTTON_OK;
}
int JavaScriptDialogViews::GetDialogButtons() const {
const bool is_alert = message_type_ == content::JAVASCRIPT_MESSAGE_TYPE_ALERT;
return ui::DIALOG_BUTTON_OK | (is_alert ? 0 : ui::DIALOG_BUTTON_CANCEL);
}
base::string16 JavaScriptDialogViews::GetWindowTitle() const {
return title_;
}
bool JavaScriptDialogViews::Cancel() {
if (dialog_callback_)
dialog_callback_.Run(false, base::string16());
return true;
}
bool JavaScriptDialogViews::Accept() {
if (dialog_callback_)
dialog_callback_.Run(true, message_box_view_->GetInputText());
return true;
}
bool JavaScriptDialogViews::Close() {
if (dialog_callback_)
dialog_callback_.Run(false, base::string16());
return true;
}
void JavaScriptDialogViews::DeleteDelegate() {
delete this;
}
views::View* JavaScriptDialogViews::GetContentsView() {
return message_box_view_;
}
views::View* JavaScriptDialogViews::GetInitiallyFocusedView() {
auto* text_box = message_box_view_->text_box();
return text_box ? text_box : views::DialogDelegate::GetInitiallyFocusedView();
}
views::Widget* JavaScriptDialogViews::GetWidget() {
return message_box_view_->GetWidget();
}
const views::Widget* JavaScriptDialogViews::GetWidget() const {
return message_box_view_->GetWidget();
}
ui::ModalType JavaScriptDialogViews::GetModalType() const {
return ui::MODAL_TYPE_CHILD;
}
JavaScriptDialogViews::JavaScriptDialogViews(
content::WebContents* parent_web_contents,
content::WebContents* alerting_web_contents,
const base::string16& title,
content::JavaScriptMessageType message_type,
const base::string16& message_text,
const base::string16& default_prompt_text,
const content::JavaScriptDialogManager::DialogClosedCallback&
dialog_callback)
: JavaScriptDialog(parent_web_contents),
title_(title),
message_type_(message_type),
message_text_(message_text),
default_prompt_text_(default_prompt_text),
dialog_callback_(dialog_callback),
weak_factory_(this) {
int options = views::MessageBoxView::DETECT_DIRECTIONALITY;
if (message_type == content::JAVASCRIPT_MESSAGE_TYPE_PROMPT)
options |= views::MessageBoxView::HAS_PROMPT_FIELD;
views::MessageBoxView::InitParams params(message_text);
params.options = options;
params.default_prompt = default_prompt_text;
message_box_view_ = new views::MessageBoxView(params);
DCHECK(message_box_view_);
constrained_window::ShowWebModalDialogViews(this, parent_web_contents);
}