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.h"
      6 
      7 #include <gtk/gtk.h>
      8 
      9 #include "base/logging.h"
     10 #include "base/strings/string_util.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "content/shell/app/resource.h"
     13 #include "content/shell/shell.h"
     14 #include "content/shell/shell_javascript_dialog_manager.h"
     15 
     16 namespace {
     17 
     18 const char kPromptTextId[] = "content_shell_prompt_text";
     19 
     20 // If there's a text entry in the dialog, get the text from the first one and
     21 // return it.
     22 string16 GetPromptText(GtkDialog* dialog) {
     23   GtkWidget* widget = static_cast<GtkWidget*>(
     24       g_object_get_data(G_OBJECT(dialog), kPromptTextId));
     25   if (widget)
     26     return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(widget)));
     27   return string16();
     28 }
     29 
     30 }  // namespace
     31 
     32 
     33 namespace content {
     34 
     35 ShellJavaScriptDialog::ShellJavaScriptDialog(
     36     ShellJavaScriptDialogManager* manager,
     37     gfx::NativeWindow parent_window,
     38     JavaScriptMessageType message_type,
     39     const string16& message_text,
     40     const string16& default_prompt_text,
     41     const JavaScriptDialogManager::DialogClosedCallback& callback)
     42     : manager_(manager),
     43       callback_(callback),
     44       parent_window_(parent_window) {
     45   GtkButtonsType buttons = GTK_BUTTONS_NONE;
     46   GtkMessageType gtk_message_type = GTK_MESSAGE_OTHER;
     47 
     48   switch (message_type) {
     49     case content::JAVASCRIPT_MESSAGE_TYPE_ALERT:
     50       buttons = GTK_BUTTONS_NONE;
     51       gtk_message_type = GTK_MESSAGE_WARNING;
     52       break;
     53 
     54     case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM:
     55       buttons = GTK_BUTTONS_CANCEL;
     56       gtk_message_type = GTK_MESSAGE_QUESTION;
     57       break;
     58 
     59     case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT:
     60       buttons = GTK_BUTTONS_CANCEL;
     61       gtk_message_type = GTK_MESSAGE_QUESTION;
     62       break;
     63 
     64     default:
     65       NOTREACHED();
     66   }
     67 
     68   gtk_dialog_ = gtk_message_dialog_new(parent_window_,
     69                                        GTK_DIALOG_MODAL,
     70                                        gtk_message_type,
     71                                        buttons,
     72                                        "%s",
     73                                        UTF16ToUTF8(message_text).c_str());
     74   g_signal_connect(gtk_dialog_,
     75                    "delete-event",
     76                    G_CALLBACK(gtk_widget_hide_on_delete),
     77                    NULL);
     78   gtk_window_set_title(GTK_WINDOW(gtk_dialog_), "JavaScript");
     79 
     80   GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_),
     81                                                GTK_STOCK_OK,
     82                                                GTK_RESPONSE_OK);
     83 
     84   if (message_type != content::JAVASCRIPT_MESSAGE_TYPE_PROMPT)
     85     gtk_widget_grab_focus(ok_button);
     86 
     87   if (message_type == content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) {
     88     GtkWidget* content_area =
     89         gtk_dialog_get_content_area(GTK_DIALOG(gtk_dialog_));
     90     GtkWidget* text_box = gtk_entry_new();
     91     gtk_entry_set_text(GTK_ENTRY(text_box),
     92                        UTF16ToUTF8(default_prompt_text).c_str());
     93     gtk_box_pack_start(GTK_BOX(content_area), text_box, TRUE, TRUE, 0);
     94     g_object_set_data(G_OBJECT(gtk_dialog_), kPromptTextId, text_box);
     95     gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE);
     96   }
     97 
     98   gtk_dialog_set_default_response(GTK_DIALOG(gtk_dialog_), GTK_RESPONSE_OK);
     99   g_signal_connect(gtk_dialog_, "response", G_CALLBACK(OnResponseThunk), this);
    100   gtk_widget_show_all(GTK_WIDGET(gtk_dialog_));
    101 }
    102 
    103 ShellJavaScriptDialog::~ShellJavaScriptDialog() {
    104 }
    105 
    106 void ShellJavaScriptDialog::Cancel() {
    107 }
    108 
    109 void ShellJavaScriptDialog::OnResponse(GtkWidget* dialog, int response_id) {
    110   switch (response_id) {
    111     case GTK_RESPONSE_OK:
    112       callback_.Run(true, GetPromptText(GTK_DIALOG(dialog)));
    113       break;
    114     case GTK_RESPONSE_CANCEL:
    115     case GTK_RESPONSE_DELETE_EVENT:
    116       callback_.Run(false, string16());
    117       break;
    118     default:
    119       NOTREACHED();
    120   }
    121 
    122   gtk_widget_destroy(dialog);
    123 
    124   manager_->DialogClosed(this);
    125 }
    126 
    127 }  // namespace content
    128