• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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