shell_javascript_dialog_manager.cc revision 3551c9c881056c480085172ff9840cab31610854
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_javascript_dialog_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_javascript_dialog.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/webkit_test_controller.h" 14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellJavaScriptDialogManager::ShellJavaScriptDialogManager() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellJavaScriptDialogManager::~ShellJavaScriptDialogManager() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellJavaScriptDialogManager::RunJavaScriptDialog( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin_url, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_lang, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JavaScriptMessageType javascript_message_type, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message_text, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_prompt_text, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DialogClosedCallback& callback, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_suppress_message) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(true, string16()); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dialog_request_callback_.is_null()) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_request_callback_.Run(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(true, string16()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_request_callback_.Reset(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = false; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dialog_) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One dialog at a time, please. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 new_message_text = net::FormatUrl(origin_url, accept_lang) + 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("\n\n") + 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_text; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent_window = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents->GetView()->GetTopLevelNativeWindow(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_.reset(new ShellJavaScriptDialog(this, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_window, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript_message_type, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_message_text, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_prompt_text, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = true; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellJavaScriptDialogManager::RunBeforeUnloadDialog( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message_text, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DialogClosedCallback& callback) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(true, string16()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dialog_request_callback_.is_null()) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_request_callback_.Run(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(true, string16()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_request_callback_.Reset(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dialog_) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seriously!? 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(true, string16()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 new_message_text = 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_text + 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("\n\nIs it OK to leave/reload this page?"); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent_window = 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents->GetView()->GetTopLevelNativeWindow(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_.reset(new ShellJavaScriptDialog(this, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_window, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JAVASCRIPT_MESSAGE_TYPE_CONFIRM, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_message_text, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), // default_prompt_text 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(true, string16()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ShellJavaScriptDialogManager::CancelActiveAndPendingDialogs( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dialog_) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_->Cancel(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_.reset(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ShellJavaScriptDialogManager::WebContentsDestroyed( 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebContents* web_contents) { 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellJavaScriptDialogManager::DialogClosed(ShellJavaScriptDialog* dialog) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(dialog, dialog_.get()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_.reset(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 144