shell_javascript_dialog_manager.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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,
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message_text,
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::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)) {
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback.Run(true, base::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();
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback.Run(true, base::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)
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 new_message_text = net::FormatUrl(origin_url, accept_lang) +
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              base::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,
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message_text,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_reload,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DialogClosedCallback& callback) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) {
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback.Run(true, base::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();
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback.Run(true, base::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!?
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback.Run(true, base::string16());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 new_message_text =
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message_text +
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::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,
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          base::string16(),  // default
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          callback));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  callback.Run(true, base::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