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.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/app/resource.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_javascript_dialog_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPromptTextId[] = "content_shell_prompt_text";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If there's a text entry in the dialog, get the text from the first one and
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return it.
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetPromptText(GtkDialog* dialog) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* widget = static_cast<GtkWidget*>(
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_object_get_data(G_OBJECT(dialog), kPromptTextId));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (widget)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(widget)));
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellJavaScriptDialog::ShellJavaScriptDialog(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellJavaScriptDialogManager* manager,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeWindow parent_window,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JavaScriptMessageType message_type,
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message_text,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& default_prompt_text,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const JavaScriptDialogManager::DialogClosedCallback& callback)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : manager_(manager),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_(callback),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent_window_(parent_window) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkButtonsType buttons = GTK_BUTTONS_NONE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkMessageType gtk_message_type = GTK_MESSAGE_OTHER;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (message_type) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case content::JAVASCRIPT_MESSAGE_TYPE_ALERT:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buttons = GTK_BUTTONS_NONE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gtk_message_type = GTK_MESSAGE_WARNING;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buttons = GTK_BUTTONS_CANCEL;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gtk_message_type = GTK_MESSAGE_QUESTION;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buttons = GTK_BUTTONS_CANCEL;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gtk_message_type = GTK_MESSAGE_QUESTION;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_dialog_ = gtk_message_dialog_new(parent_window_,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GTK_DIALOG_MODAL,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       gtk_message_type,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       buttons,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "%s",
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UTF16ToUTF8(message_text).c_str());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(gtk_dialog_,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "delete-event",
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   G_CALLBACK(gtk_widget_hide_on_delete),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   NULL);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_set_title(GTK_WINDOW(gtk_dialog_), "JavaScript");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               GTK_STOCK_OK,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               GTK_RESPONSE_OK);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_type != content::JAVASCRIPT_MESSAGE_TYPE_PROMPT)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_widget_grab_focus(ok_button);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_type == content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GtkWidget* content_area =
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gtk_dialog_get_content_area(GTK_DIALOG(gtk_dialog_));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GtkWidget* text_box = gtk_entry_new();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_entry_set_text(GTK_ENTRY(text_box),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UTF16ToUTF8(default_prompt_text).c_str());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_box_pack_start(GTK_BOX(content_area), text_box, TRUE, TRUE, 0);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_object_set_data(G_OBJECT(gtk_dialog_), kPromptTextId, text_box);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_dialog_set_default_response(GTK_DIALOG(gtk_dialog_), GTK_RESPONSE_OK);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(gtk_dialog_, "response", G_CALLBACK(OnResponseThunk), this);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_show_all(GTK_WIDGET(gtk_dialog_));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellJavaScriptDialog::~ShellJavaScriptDialog() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellJavaScriptDialog::Cancel() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellJavaScriptDialog::OnResponse(GtkWidget* dialog, int response_id) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (response_id) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GTK_RESPONSE_OK:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_.Run(true, GetPromptText(GTK_DIALOG(dialog)));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GTK_RESPONSE_CANCEL:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GTK_RESPONSE_DELETE_EVENT:
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      callback_.Run(false, base::string16());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_destroy(dialog);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->DialogClosed(this);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
128