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