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 "content/shell/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/common/shell_switches.h" 13#include "content/shell/shell_javascript_dialog.h" 14#include "content/shell/webkit_test_controller.h" 15#include "net/base/net_util.h" 16 17namespace content { 18 19ShellJavaScriptDialogManager::ShellJavaScriptDialogManager() { 20} 21 22ShellJavaScriptDialogManager::~ShellJavaScriptDialogManager() { 23} 24 25void ShellJavaScriptDialogManager::RunJavaScriptDialog( 26 WebContents* web_contents, 27 const GURL& origin_url, 28 const std::string& accept_lang, 29 JavaScriptMessageType javascript_message_type, 30 const string16& message_text, 31 const string16& default_prompt_text, 32 const DialogClosedCallback& callback, 33 bool* did_suppress_message) { 34 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 35 callback.Run(true, string16()); 36 return; 37 } 38 39 if (!dialog_request_callback_.is_null()) { 40 dialog_request_callback_.Run(); 41 callback.Run(true, 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 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 74void ShellJavaScriptDialogManager::RunBeforeUnloadDialog( 75 WebContents* web_contents, 76 const string16& message_text, 77 bool is_reload, 78 const DialogClosedCallback& callback) { 79 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 80 callback.Run(true, string16()); 81 return; 82 } 83 84 if (!dialog_request_callback_.is_null()) { 85 dialog_request_callback_.Run(); 86 callback.Run(true, 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, string16()); 95 return; 96 } 97 98 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 string16(), // default_prompt_text 110 callback)); 111#else 112 // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 113 callback.Run(true, string16()); 114 return; 115#endif 116} 117 118void 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 130void ShellJavaScriptDialogManager::WebContentsDestroyed( 131 WebContents* web_contents) { 132} 133 134void 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