Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: chrome/browser/ui/app_modal_dialogs/javascript_dialog_creator.cc

Issue 12082123: Rename JavaScriptDialogCreator to JavaScriptDialogManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/ui/app_modal_dialogs/javascript_dialog_creator.h"
6
7 #include <map>
8
9 #include "base/compiler_specific.h"
10 #include "base/i18n/rtl.h"
11 #include "base/memory/singleton.h"
12 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/extensions/extension_host.h"
14 #include "chrome/browser/extensions/extension_service.h"
15 #include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
16 #include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
17 #include "chrome/common/chrome_constants.h"
18 #include "chrome/common/chrome_notification_types.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21 #include "content/public/browser/notification_service.h"
22 #include "content/public/common/content_client.h"
23 #include "content/public/common/javascript_message_type.h"
24 #include "grit/generated_resources.h"
25 #include "net/base/net_util.h"
26 #include "ui/base/l10n/l10n_util.h"
27
28 using content::JavaScriptDialogCreator;
29 using content::WebContents;
30
31 namespace {
32
33 class ChromeJavaScriptDialogCreator : public JavaScriptDialogCreator,
34 public content::NotificationObserver {
35 public:
36 static ChromeJavaScriptDialogCreator* GetInstance();
37
38 explicit ChromeJavaScriptDialogCreator(
39 extensions::ExtensionHost* extension_host);
40 virtual ~ChromeJavaScriptDialogCreator();
41
42 virtual void RunJavaScriptDialog(
43 WebContents* web_contents,
44 const GURL& origin_url,
45 const std::string& accept_lang,
46 content::JavaScriptMessageType message_type,
47 const string16& message_text,
48 const string16& default_prompt_text,
49 const DialogClosedCallback& callback,
50 bool* did_suppress_message) OVERRIDE;
51
52 virtual void RunBeforeUnloadDialog(
53 WebContents* web_contents,
54 const string16& message_text,
55 bool is_reload,
56 const DialogClosedCallback& callback) OVERRIDE;
57
58 virtual void ResetJavaScriptState(WebContents* web_contents) OVERRIDE;
59
60 private:
61 ChromeJavaScriptDialogCreator();
62
63 friend struct DefaultSingletonTraits<ChromeJavaScriptDialogCreator>;
64
65 // Overridden from content::NotificationObserver:
66 virtual void Observe(int type,
67 const content::NotificationSource& source,
68 const content::NotificationDetails& details) OVERRIDE;
69
70 string16 GetTitle(const GURL& origin_url,
71 const std::string& accept_lang,
72 bool is_alert);
73
74 void CancelPendingDialogs(WebContents* web_contents);
75
76 // Wrapper around a DialogClosedCallback so that we can intercept it before
77 // passing it onto the original callback.
78 void OnDialogClosed(DialogClosedCallback callback,
79 bool success,
80 const string16& user_input);
81
82 // Mapping between the WebContents and their extra data. The key
83 // is a void* because the pointer is just a cookie and is never dereferenced.
84 typedef std::map<void*, ChromeJavaScriptDialogExtraData>
85 JavaScriptDialogExtraDataMap;
86 JavaScriptDialogExtraDataMap javascript_dialog_extra_data_;
87
88 // Extension Host which owns the ChromeJavaScriptDialogCreator instance.
89 // It's used to get a extension name from a URL.
90 // If it's not owned by any Extension, it should be NULL.
91 extensions::ExtensionHost* extension_host_;
92
93 content::NotificationRegistrar registrar_;
94
95 DISALLOW_COPY_AND_ASSIGN(ChromeJavaScriptDialogCreator);
96 };
97
98 ////////////////////////////////////////////////////////////////////////////////
99 // ChromeJavaScriptDialogCreator, public:
100
101 ChromeJavaScriptDialogCreator::ChromeJavaScriptDialogCreator()
102 : extension_host_(NULL) {
103 }
104
105 ChromeJavaScriptDialogCreator::~ChromeJavaScriptDialogCreator() {
106 extension_host_ = NULL;
107 }
108
109 ChromeJavaScriptDialogCreator::ChromeJavaScriptDialogCreator(
110 extensions::ExtensionHost* extension_host)
111 : extension_host_(extension_host) {
112 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
113 content::Source<Profile>(extension_host_->profile()));
114 }
115
116 // static
117 ChromeJavaScriptDialogCreator* ChromeJavaScriptDialogCreator::GetInstance() {
118 return Singleton<ChromeJavaScriptDialogCreator>::get();
119 }
120
121 void ChromeJavaScriptDialogCreator::RunJavaScriptDialog(
122 WebContents* web_contents,
123 const GURL& origin_url,
124 const std::string& accept_lang,
125 content::JavaScriptMessageType message_type,
126 const string16& message_text,
127 const string16& default_prompt_text,
128 const DialogClosedCallback& callback,
129 bool* did_suppress_message) {
130 *did_suppress_message = false;
131
132 ChromeJavaScriptDialogExtraData* extra_data =
133 &javascript_dialog_extra_data_[web_contents];
134
135 if (extra_data->suppress_javascript_messages_) {
136 *did_suppress_message = true;
137 return;
138 }
139
140 base::TimeDelta time_since_last_message = base::TimeTicks::Now() -
141 extra_data->last_javascript_message_dismissal_;
142 bool display_suppress_checkbox = false;
143 // Show a checkbox offering to suppress further messages if this message is
144 // being displayed within kJavascriptMessageExpectedDelay of the last one.
145 if (time_since_last_message <
146 base::TimeDelta::FromMilliseconds(
147 chrome::kJavascriptMessageExpectedDelay)) {
148 display_suppress_checkbox = true;
149 }
150
151 bool is_alert = message_type == content::JAVASCRIPT_MESSAGE_TYPE_ALERT;
152 string16 dialog_title = GetTitle(origin_url, accept_lang, is_alert);
153
154 if (extension_host_)
155 extension_host_->WillRunJavaScriptDialog();
156
157 AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
158 web_contents,
159 extra_data,
160 dialog_title,
161 message_type,
162 message_text,
163 default_prompt_text,
164 display_suppress_checkbox,
165 false, // is_before_unload_dialog
166 false, // is_reload
167 base::Bind(&ChromeJavaScriptDialogCreator::OnDialogClosed,
168 base::Unretained(this), callback)));
169 }
170
171 void ChromeJavaScriptDialogCreator::RunBeforeUnloadDialog(
172 WebContents* web_contents,
173 const string16& message_text,
174 bool is_reload,
175 const DialogClosedCallback& callback) {
176 ChromeJavaScriptDialogExtraData* extra_data =
177 &javascript_dialog_extra_data_[web_contents];
178
179 const string16 title = l10n_util::GetStringUTF16(is_reload ?
180 IDS_BEFORERELOAD_MESSAGEBOX_TITLE : IDS_BEFOREUNLOAD_MESSAGEBOX_TITLE);
181 const string16 footer = l10n_util::GetStringUTF16(is_reload ?
182 IDS_BEFORERELOAD_MESSAGEBOX_FOOTER : IDS_BEFOREUNLOAD_MESSAGEBOX_FOOTER);
183
184 string16 full_message = message_text + ASCIIToUTF16("\n\n") + footer;
185
186 if (extension_host_)
187 extension_host_->WillRunJavaScriptDialog();
188
189 AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
190 web_contents,
191 extra_data,
192 title,
193 content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM,
194 full_message,
195 string16(), // default_prompt_text
196 false, // display_suppress_checkbox
197 true, // is_before_unload_dialog
198 is_reload,
199 base::Bind(&ChromeJavaScriptDialogCreator::OnDialogClosed,
200 base::Unretained(this), callback)));
201 }
202
203 void ChromeJavaScriptDialogCreator::ResetJavaScriptState(
204 WebContents* web_contents) {
205 CancelPendingDialogs(web_contents);
206 javascript_dialog_extra_data_.erase(web_contents);
207 }
208
209 void ChromeJavaScriptDialogCreator::Observe(
210 int type,
211 const content::NotificationSource& source,
212 const content::NotificationDetails& details) {
213 DCHECK_EQ(type, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED);
214 extension_host_ = NULL;
215 }
216
217 string16 ChromeJavaScriptDialogCreator::GetTitle(const GURL& origin_url,
218 const std::string& accept_lang,
219 bool is_alert) {
220 // If the URL hasn't any host, return the default string.
221 if (!origin_url.has_host()) {
222 return l10n_util::GetStringUTF16(
223 is_alert ? IDS_JAVASCRIPT_ALERT_DEFAULT_TITLE
224 : IDS_JAVASCRIPT_MESSAGEBOX_DEFAULT_TITLE);
225 }
226
227 // If the URL is a chrome extension one, return the extension name.
228 if (extension_host_) {
229 const extensions::Extension* extension = extension_host_->
230 profile()->GetExtensionService()->extensions()->
231 GetExtensionOrAppByURL(ExtensionURLInfo(origin_url));
232 if (extension) {
233 return UTF8ToUTF16(base::StringPiece(extension->name()));
234 }
235 }
236
237 // Otherwise, return the formatted URL.
238 // In this case, force URL to have LTR directionality.
239 string16 url_string = net::FormatUrl(origin_url, accept_lang);
240 return l10n_util::GetStringFUTF16(
241 is_alert ? IDS_JAVASCRIPT_ALERT_TITLE
242 : IDS_JAVASCRIPT_MESSAGEBOX_TITLE,
243 base::i18n::GetDisplayStringInLTRDirectionality(url_string));
244 }
245
246 void ChromeJavaScriptDialogCreator::CancelPendingDialogs(
247 WebContents* web_contents) {
248 AppModalDialogQueue* queue = AppModalDialogQueue::GetInstance();
249 AppModalDialog* active_dialog = queue->active_dialog();
250 if (active_dialog && active_dialog->web_contents() == web_contents)
251 active_dialog->Invalidate();
252 for (AppModalDialogQueue::iterator i = queue->begin();
253 i != queue->end(); ++i) {
254 if ((*i)->web_contents() == web_contents)
255 (*i)->Invalidate();
256 }
257 }
258
259 void ChromeJavaScriptDialogCreator::OnDialogClosed(
260 DialogClosedCallback callback,
261 bool success,
262 const string16& user_input) {
263 if (extension_host_)
264 extension_host_->DidCloseJavaScriptDialog();
265 callback.Run(success, user_input);
266 }
267
268 } // namespace
269
270 content::JavaScriptDialogCreator* GetJavaScriptDialogCreatorInstance() {
271 return ChromeJavaScriptDialogCreator::GetInstance();
272 }
273
274 content::JavaScriptDialogCreator* CreateJavaScriptDialogCreatorInstance(
275 extensions::ExtensionHost* extension_host) {
276 return new ChromeJavaScriptDialogCreator(extension_host);
277 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698