blob: 4279bfa3bb76ca2a441be44644db100abed94ef5 [file] [log] [blame]
// Copyright 2017 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.
#import "ios/web_view/internal/web_view_java_script_dialog_presenter.h"
#import "ios/web_view/public/cwv_ui_delegate.h"
#import "net/base/mac/url_conversions.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ios_web_view {
WebViewJavaScriptDialogPresenter::WebViewJavaScriptDialogPresenter(
CWVWebView* web_view,
id<CWVUIDelegate> ui_delegate)
: ui_delegate_(ui_delegate), web_view_(web_view) {}
WebViewJavaScriptDialogPresenter::~WebViewJavaScriptDialogPresenter() = default;
void WebViewJavaScriptDialogPresenter::RunJavaScriptDialog(
web::WebState* web_state,
const GURL& origin_url,
web::JavaScriptDialogType dialog_type,
NSString* message_text,
NSString* default_prompt_text,
web::DialogClosedCallback callback) {
switch (dialog_type) {
case web::JAVASCRIPT_DIALOG_TYPE_ALERT:
HandleJavaScriptAlert(origin_url, message_text, std::move(callback));
break;
case web::JAVASCRIPT_DIALOG_TYPE_CONFIRM:
HandleJavaScriptConfirmDialog(origin_url, message_text,
std::move(callback));
break;
case web::JAVASCRIPT_DIALOG_TYPE_PROMPT:
HandleJavaScriptTextPrompt(origin_url, message_text, default_prompt_text,
std::move(callback));
break;
}
}
void WebViewJavaScriptDialogPresenter::HandleJavaScriptAlert(
const GURL& origin_url,
NSString* message_text,
web::DialogClosedCallback callback) {
if (![ui_delegate_ respondsToSelector:@selector
(webView:runJavaScriptAlertPanelWithMessage:pageURL
:completionHandler:)]) {
std::move(callback).Run(NO, nil);
return;
}
__block web::DialogClosedCallback scoped_callback = std::move(callback);
[ui_delegate_ webView:web_view_
runJavaScriptAlertPanelWithMessage:message_text
pageURL:net::NSURLWithGURL(origin_url)
completionHandler:^{
if (!scoped_callback.is_null()) {
std::move(scoped_callback).Run(YES, nil);
}
}];
}
void WebViewJavaScriptDialogPresenter::HandleJavaScriptConfirmDialog(
const GURL& origin_url,
NSString* message_text,
web::DialogClosedCallback callback) {
if (![ui_delegate_ respondsToSelector:@selector
(webView:runJavaScriptConfirmPanelWithMessage:pageURL
:completionHandler:)]) {
std::move(callback).Run(NO, nil);
return;
}
__block web::DialogClosedCallback scoped_callback = std::move(callback);
[ui_delegate_ webView:web_view_
runJavaScriptConfirmPanelWithMessage:message_text
pageURL:net::NSURLWithGURL(origin_url)
completionHandler:^(BOOL is_confirmed) {
if (!scoped_callback.is_null()) {
std::move(scoped_callback).Run(is_confirmed, nil);
}
}];
}
void WebViewJavaScriptDialogPresenter::HandleJavaScriptTextPrompt(
const GURL& origin_url,
NSString* message_text,
NSString* default_prompt_text,
web::DialogClosedCallback callback) {
if (![ui_delegate_ respondsToSelector:@selector
(webView:runJavaScriptTextInputPanelWithPrompt:defaultText
:pageURL:completionHandler:)]) {
std::move(callback).Run(NO, nil);
return;
}
__block web::DialogClosedCallback scoped_callback = std::move(callback);
[ui_delegate_ webView:web_view_
runJavaScriptTextInputPanelWithPrompt:message_text
defaultText:default_prompt_text
pageURL:net::NSURLWithGURL(origin_url)
completionHandler:^(NSString* text_input) {
if (!scoped_callback.is_null()) {
if (text_input == nil) {
std::move(scoped_callback).Run(NO, nil);
} else {
std::move(scoped_callback).Run(YES, text_input);
}
}
}];
}
void WebViewJavaScriptDialogPresenter::CancelDialogs(web::WebState* web_state) {
}
void WebViewJavaScriptDialogPresenter::SetUIDelegate(
id<CWVUIDelegate> ui_delegate) {
ui_delegate_ = ui_delegate;
}
} // namespace ios_web_view