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