1 // Copyright 2013 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 "content/shell/browser/shell_javascript_dialog_manager.h" 6 7 #include "base/command_line.h" 8 #include "base/logging.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "content/public/browser/web_contents.h" 11 #include "content/public/browser/web_contents_view.h" 12 #include "content/shell/browser/shell_javascript_dialog.h" 13 #include "content/shell/browser/webkit_test_controller.h" 14 #include "content/shell/common/shell_switches.h" 15 #include "net/base/net_util.h" 16 17 namespace content { 18 19 ShellJavaScriptDialogManager::ShellJavaScriptDialogManager() { 20 } 21 22 ShellJavaScriptDialogManager::~ShellJavaScriptDialogManager() { 23 } 24 25 void ShellJavaScriptDialogManager::RunJavaScriptDialog( 26 WebContents* web_contents, 27 const GURL& origin_url, 28 const std::string& accept_lang, 29 JavaScriptMessageType javascript_message_type, 30 const base::string16& message_text, 31 const base::string16& default_prompt_text, 32 const DialogClosedCallback& callback, 33 bool* did_suppress_message) { 34 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 35 callback.Run(true, base::string16()); 36 return; 37 } 38 39 if (!dialog_request_callback_.is_null()) { 40 dialog_request_callback_.Run(); 41 callback.Run(true, base::string16()); 42 dialog_request_callback_.Reset(); 43 return; 44 } 45 46 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 47 *did_suppress_message = false; 48 49 if (dialog_) { 50 // One dialog at a time, please. 51 *did_suppress_message = true; 52 return; 53 } 54 55 base::string16 new_message_text = net::FormatUrl(origin_url, accept_lang) + 56 ASCIIToUTF16("\n\n") + 57 message_text; 58 gfx::NativeWindow parent_window = 59 web_contents->GetView()->GetTopLevelNativeWindow(); 60 61 dialog_.reset(new ShellJavaScriptDialog(this, 62 parent_window, 63 javascript_message_type, 64 new_message_text, 65 default_prompt_text, 66 callback)); 67 #else 68 // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 69 *did_suppress_message = true; 70 return; 71 #endif 72 } 73 74 void ShellJavaScriptDialogManager::RunBeforeUnloadDialog( 75 WebContents* web_contents, 76 const base::string16& message_text, 77 bool is_reload, 78 const DialogClosedCallback& callback) { 79 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 80 callback.Run(true, base::string16()); 81 return; 82 } 83 84 if (!dialog_request_callback_.is_null()) { 85 dialog_request_callback_.Run(); 86 callback.Run(true, base::string16()); 87 dialog_request_callback_.Reset(); 88 return; 89 } 90 91 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 92 if (dialog_) { 93 // Seriously!? 94 callback.Run(true, base::string16()); 95 return; 96 } 97 98 base::string16 new_message_text = 99 message_text + 100 ASCIIToUTF16("\n\nIs it OK to leave/reload this page?"); 101 102 gfx::NativeWindow parent_window = 103 web_contents->GetView()->GetTopLevelNativeWindow(); 104 105 dialog_.reset(new ShellJavaScriptDialog(this, 106 parent_window, 107 JAVASCRIPT_MESSAGE_TYPE_CONFIRM, 108 new_message_text, 109 base::string16(), // default 110 callback)); 111 #else 112 // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 113 callback.Run(true, base::string16()); 114 return; 115 #endif 116 } 117 118 void ShellJavaScriptDialogManager::CancelActiveAndPendingDialogs( 119 WebContents* web_contents) { 120 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 121 if (dialog_) { 122 dialog_->Cancel(); 123 dialog_.reset(); 124 } 125 #else 126 // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 127 #endif 128 } 129 130 void ShellJavaScriptDialogManager::WebContentsDestroyed( 131 WebContents* web_contents) { 132 } 133 134 void ShellJavaScriptDialogManager::DialogClosed(ShellJavaScriptDialog* dialog) { 135 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 136 DCHECK_EQ(dialog, dialog_.get()); 137 dialog_.reset(); 138 #else 139 // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 140 #endif 141 } 142 143 } // namespace content 144