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