Home | History | Annotate | Download | only in shell
      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 
     17 namespace content {
     18 
     19 ShellJavaScriptDialogManager::ShellJavaScriptDialogManager() {
     20 }
     21 
     22 ShellJavaScriptDialogManager::~ShellJavaScriptDialogManager() {
     23 }
     24 
     25 void 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 
     74 void 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 
    118 void 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 
    130 void ShellJavaScriptDialogManager::WebContentsDestroyed(
    131     WebContents* web_contents) {
    132 }
    133 
    134 void 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