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 #ifndef CHROME_BROWSER_UI_APP_MODAL_DIALOGS_JAVASCRIPT_APP_MODAL_DIALOG_H_ 6 #define CHROME_BROWSER_UI_APP_MODAL_DIALOGS_JAVASCRIPT_APP_MODAL_DIALOG_H_ 7 8 #include <map> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/time/time.h" 13 #include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h" 14 #include "content/public/browser/javascript_dialog_manager.h" 15 16 // Extra data for JavaScript dialogs to add Chrome-only features. 17 class ChromeJavaScriptDialogExtraData { 18 public: 19 ChromeJavaScriptDialogExtraData(); 20 21 // The time that the last JavaScript dialog was dismissed. 22 base::TimeTicks last_javascript_message_dismissal_; 23 24 // True if the user has decided to block future JavaScript dialogs. 25 bool suppress_javascript_messages_; 26 }; 27 28 // A controller + model class for JavaScript alert, confirm, prompt, and 29 // onbeforeunload dialog boxes. 30 class JavaScriptAppModalDialog : public AppModalDialog { 31 public: 32 typedef std::map<void*, ChromeJavaScriptDialogExtraData> ExtraDataMap; 33 34 JavaScriptAppModalDialog( 35 content::WebContents* web_contents, 36 ExtraDataMap* extra_data_map, 37 const string16& title, 38 content::JavaScriptMessageType javascript_message_type, 39 const string16& message_text, 40 const string16& default_prompt_text, 41 bool display_suppress_checkbox, 42 bool is_before_unload_dialog, 43 bool is_reload, 44 const content::JavaScriptDialogManager::DialogClosedCallback& callback); 45 virtual ~JavaScriptAppModalDialog(); 46 47 // Overridden from AppModalDialog: 48 virtual NativeAppModalDialog* CreateNativeDialog() OVERRIDE; 49 virtual bool IsJavaScriptModalDialog() OVERRIDE; 50 virtual void Invalidate() OVERRIDE; 51 52 // Callbacks from NativeDialog when the user accepts or cancels the dialog. 53 void OnCancel(bool suppress_js_messages); 54 void OnAccept(const string16& prompt_text, bool suppress_js_messages); 55 56 // NOTE: This is only called under Views, and should be removed. Any critical 57 // work should be done in OnCancel or OnAccept. See crbug.com/63732 for more. 58 void OnClose(); 59 60 // Used only for testing. The dialog will use the given text when notifying 61 // its delegate instead of whatever the UI reports. 62 void SetOverridePromptText(const string16& prompt_text); 63 64 // Accessors 65 content::JavaScriptMessageType javascript_message_type() const { 66 return javascript_message_type_; 67 } 68 string16 message_text() const { return message_text_; } 69 string16 default_prompt_text() const { return default_prompt_text_; } 70 bool display_suppress_checkbox() const { return display_suppress_checkbox_; } 71 bool is_before_unload_dialog() const { return is_before_unload_dialog_; } 72 bool is_reload() const { return is_reload_; } 73 74 private: 75 // Notifies the delegate with the result of the dialog. 76 void NotifyDelegate(bool success, const string16& prompt_text, 77 bool suppress_js_messages); 78 79 // A map of extra Chrome-only data associated with the delegate_. 80 // Can be inspected via extra_data_map_[web_contents_]. 81 ExtraDataMap* extra_data_map_; 82 83 // Information about the message box is held in the following variables. 84 const content::JavaScriptMessageType javascript_message_type_; 85 string16 message_text_; 86 string16 default_prompt_text_; 87 bool display_suppress_checkbox_; 88 bool is_before_unload_dialog_; 89 bool is_reload_; 90 91 content::JavaScriptDialogManager::DialogClosedCallback callback_; 92 93 // Used only for testing. Specifies alternative prompt text that should be 94 // used when notifying the delegate, if |use_override_prompt_text_| is true. 95 string16 override_prompt_text_; 96 bool use_override_prompt_text_; 97 98 DISALLOW_COPY_AND_ASSIGN(JavaScriptAppModalDialog); 99 }; 100 101 #endif // CHROME_BROWSER_UI_APP_MODAL_DIALOGS_JAVASCRIPT_APP_MODAL_DIALOG_H_ 102