1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/guest_view/web_view/javascript_dialog_helper.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/values.h"
9 #include "chrome/browser/guest_view/guest_view_constants.h"
10 #include "chrome/browser/guest_view/web_view/web_view_constants.h"
11 #include "chrome/browser/guest_view/web_view/web_view_guest.h"
12 #include "chrome/browser/guest_view/web_view/web_view_permission_types.h"
13
14 namespace {
15
JavaScriptMessageTypeToString(content::JavaScriptMessageType message_type)16 std::string JavaScriptMessageTypeToString(
17 content::JavaScriptMessageType message_type) {
18 switch (message_type) {
19 case content::JAVASCRIPT_MESSAGE_TYPE_ALERT:
20 return "alert";
21 case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM:
22 return "confirm";
23 case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT:
24 return "prompt";
25 default:
26 NOTREACHED() << "Unknown JavaScript Message Type.";
27 return "unknown";
28 }
29 }
30
31 } // namespace
32
JavaScriptDialogHelper(WebViewGuest * guest)33 JavaScriptDialogHelper::JavaScriptDialogHelper(WebViewGuest* guest)
34 : webview_guest_(guest) {
35 }
36
~JavaScriptDialogHelper()37 JavaScriptDialogHelper::~JavaScriptDialogHelper() {
38 }
39
RunJavaScriptDialog(content::WebContents * web_contents,const GURL & origin_url,const std::string & accept_lang,content::JavaScriptMessageType javascript_message_type,const base::string16 & message_text,const base::string16 & default_prompt_text,const DialogClosedCallback & callback,bool * did_suppress_message)40 void JavaScriptDialogHelper::RunJavaScriptDialog(
41 content::WebContents* web_contents,
42 const GURL& origin_url,
43 const std::string& accept_lang,
44 content::JavaScriptMessageType javascript_message_type,
45 const base::string16& message_text,
46 const base::string16& default_prompt_text,
47 const DialogClosedCallback& callback,
48 bool* did_suppress_message) {
49 base::DictionaryValue request_info;
50 request_info.Set(
51 webview::kDefaultPromptText,
52 base::Value::CreateStringValue(base::UTF16ToUTF8(default_prompt_text)));
53 request_info.Set(
54 webview::kMessageText,
55 base::Value::CreateStringValue(base::UTF16ToUTF8(message_text)));
56 request_info.Set(
57 webview::kMessageType,
58 base::Value::CreateStringValue(
59 JavaScriptMessageTypeToString(javascript_message_type)));
60 request_info.Set(
61 guestview::kUrl,
62 base::Value::CreateStringValue(origin_url.spec()));
63 webview_guest_->RequestPermission(
64 WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG,
65 request_info,
66 base::Bind(&JavaScriptDialogHelper::OnPermissionResponse,
67 base::Unretained(this),
68 callback),
69 false /* allowed_by_default */);
70 }
71
RunBeforeUnloadDialog(content::WebContents * web_contents,const base::string16 & message_text,bool is_reload,const DialogClosedCallback & callback)72 void JavaScriptDialogHelper::RunBeforeUnloadDialog(
73 content::WebContents* web_contents,
74 const base::string16& message_text,
75 bool is_reload,
76 const DialogClosedCallback& callback) {
77 // This is called if the guest has a beforeunload event handler.
78 // This callback allows navigation to proceed.
79 callback.Run(true, base::string16());
80 }
81
HandleJavaScriptDialog(content::WebContents * web_contents,bool accept,const base::string16 * prompt_override)82 bool JavaScriptDialogHelper::HandleJavaScriptDialog(
83 content::WebContents* web_contents,
84 bool accept,
85 const base::string16* prompt_override) {
86 return false;
87 }
88
CancelActiveAndPendingDialogs(content::WebContents * web_contents)89 void JavaScriptDialogHelper::CancelActiveAndPendingDialogs(
90 content::WebContents* web_contents) {
91 }
92
WebContentsDestroyed(content::WebContents * web_contents)93 void JavaScriptDialogHelper::WebContentsDestroyed(
94 content::WebContents* web_contents) {
95 }
96
OnPermissionResponse(const DialogClosedCallback & callback,bool allow,const std::string & user_input)97 void JavaScriptDialogHelper::OnPermissionResponse(
98 const DialogClosedCallback& callback,
99 bool allow,
100 const std::string& user_input) {
101 callback.Run(allow && webview_guest_->attached(),
102 base::UTF8ToUTF16(user_input));
103 }
104