diff options
author | shouqun.liu@intel.com <shouqun.liu@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-30 20:52:48 +0000 |
---|---|---|
committer | shouqun.liu@intel.com <shouqun.liu@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-30 20:52:48 +0000 |
commit | fc4f4dd485275e55b768c4deb9a253d17aeb7806 (patch) | |
tree | 859420ed1d769f632320f8f16ac2e8f5d8b037f3 /content | |
parent | cfb71063b219d54589664da51d605301e14c6c69 (diff) | |
download | chromium_src-fc4f4dd485275e55b768c4deb9a253d17aeb7806.zip chromium_src-fc4f4dd485275e55b768c4deb9a253d17aeb7806.tar.gz chromium_src-fc4f4dd485275e55b768c4deb9a253d17aeb7806.tar.bz2 |
Content shell/GTK: Add JavaScript dialog support.
- Add popup dialog support for JavaScript alert/confirm/prompt fuctions
on content shell GTK port.
BUG=90445,138603
TEST=
TBR=jam@chromium.org
Review URL: https://chromiumcodereview.appspot.com/10824077
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149019 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/content_shell.gypi | 1 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog.h | 9 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog_creator.cc | 16 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog_creator.h | 2 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog_gtk.cc | 127 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog_mac.mm | 1 | ||||
-rw-r--r-- | content/shell/shell_javascript_dialog_win.cc | 1 |
7 files changed, 152 insertions, 5 deletions
diff --git a/content/content_shell.gypi b/content/content_shell.gypi index 61b6aa0..cfb8b42 100644 --- a/content/content_shell.gypi +++ b/content/content_shell.gypi @@ -80,6 +80,7 @@ 'shell/shell_download_manager_delegate.h', 'shell/shell_javascript_dialog_creator.cc', 'shell/shell_javascript_dialog_creator.h', + 'shell/shell_javascript_dialog_gtk.cc', 'shell/shell_javascript_dialog_mac.mm', 'shell/shell_javascript_dialog_win.cc', 'shell/shell_javascript_dialog.h', diff --git a/content/shell/shell_javascript_dialog.h b/content/shell/shell_javascript_dialog.h index 12dd882..68fe2ea 100644 --- a/content/shell/shell_javascript_dialog.h +++ b/content/shell/shell_javascript_dialog.h @@ -7,6 +7,10 @@ #include "content/public/browser/javascript_dialogs.h" +#if defined(TOOLKIT_GTK) +#include "ui/base/gtk/gtk_signal.h" +#endif + #if defined(OS_MACOSX) #if __OBJC__ @class ShellJavaScriptDialogHelper; @@ -23,6 +27,7 @@ class ShellJavaScriptDialog { public: ShellJavaScriptDialog( ShellJavaScriptDialogCreator* creator, + gfx::NativeWindow parent_window, JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, @@ -45,6 +50,10 @@ class ShellJavaScriptDialog { string16 default_prompt_text_; static INT_PTR CALLBACK DialogProc(HWND dialog, UINT message, WPARAM wparam, LPARAM lparam); +#elif defined(TOOLKIT_GTK) + GtkWidget* gtk_dialog_; + gfx::NativeWindow parent_window_; + CHROMEGTK_CALLBACK_1(ShellJavaScriptDialog, void, OnResponse, int); #endif DISALLOW_COPY_AND_ASSIGN(ShellJavaScriptDialog); diff --git a/content/shell/shell_javascript_dialog_creator.cc b/content/shell/shell_javascript_dialog_creator.cc index ceb1a8b..8752e4c 100644 --- a/content/shell/shell_javascript_dialog_creator.cc +++ b/content/shell/shell_javascript_dialog_creator.cc @@ -8,6 +8,7 @@ #include "base/logging.h" #include "base/utf_string_conversions.h" #include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_view.h" #include "content/shell/layout_test_controller_host.h" #include "content/shell/shell_javascript_dialog.h" #include "content/shell/shell_switches.h" @@ -51,7 +52,7 @@ void ShellJavaScriptDialogCreator::RunJavaScriptDialog( return; } -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) *did_suppress_message = false; if (dialog_.get()) { @@ -63,8 +64,11 @@ void ShellJavaScriptDialogCreator::RunJavaScriptDialog( string16 new_message_text = net::FormatUrl(origin_url, accept_lang) + ASCIIToUTF16("\n\n") + message_text; + gfx::NativeWindow parent_window = + web_contents->GetView()->GetTopLevelNativeWindow(); dialog_.reset(new ShellJavaScriptDialog(this, + parent_window, javascript_message_type, new_message_text, default_prompt_text, @@ -99,7 +103,7 @@ void ShellJavaScriptDialogCreator::RunBeforeUnloadDialog( return; } -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) if (dialog_.get()) { // Seriously!? callback.Run(true, string16()); @@ -110,7 +114,11 @@ void ShellJavaScriptDialogCreator::RunBeforeUnloadDialog( message_text + ASCIIToUTF16("\n\nIs it OK to leave/reload this page?"); + gfx::NativeWindow parent_window = + web_contents->GetView()->GetTopLevelNativeWindow(); + dialog_.reset(new ShellJavaScriptDialog(this, + parent_window, JAVASCRIPT_MESSAGE_TYPE_CONFIRM, new_message_text, string16(), // default_prompt_text @@ -124,7 +132,7 @@ void ShellJavaScriptDialogCreator::RunBeforeUnloadDialog( void ShellJavaScriptDialogCreator::ResetJavaScriptState( WebContents* web_contents) { -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) if (dialog_.get()) { dialog_->Cancel(); dialog_.reset(); @@ -135,7 +143,7 @@ void ShellJavaScriptDialogCreator::ResetJavaScriptState( } void ShellJavaScriptDialogCreator::DialogClosed(ShellJavaScriptDialog* dialog) { -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) DCHECK_EQ(dialog, dialog_.get()); dialog_.reset(); #else diff --git a/content/shell/shell_javascript_dialog_creator.h b/content/shell/shell_javascript_dialog_creator.h index 0dd67ce..704729d 100644 --- a/content/shell/shell_javascript_dialog_creator.h +++ b/content/shell/shell_javascript_dialog_creator.h @@ -48,7 +48,7 @@ class ShellJavaScriptDialogCreator : public JavaScriptDialogCreator { } private: -#if defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_MACOSX) || defined(OS_WIN) || defined(TOOLKIT_GTK) // The dialog being shown. No queueing. scoped_ptr<ShellJavaScriptDialog> dialog_; #else diff --git a/content/shell/shell_javascript_dialog_gtk.cc b/content/shell/shell_javascript_dialog_gtk.cc new file mode 100644 index 0000000..3fdaddd --- /dev/null +++ b/content/shell/shell_javascript_dialog_gtk.cc @@ -0,0 +1,127 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/shell/shell_javascript_dialog.h" + +#include <gtk/gtk.h> + +#include "base/logging.h" +#include "base/string_util.h" +#include "base/utf_string_conversions.h" +#include "content/shell/resource.h" +#include "content/shell/shell.h" +#include "content/shell/shell_javascript_dialog_creator.h" + +namespace { + +const char kPromptTextId[] = "content_shell_prompt_text"; + +// If there's a text entry in the dialog, get the text from the first one and +// return it. +string16 GetPromptText(GtkDialog* dialog) { + GtkWidget* widget = static_cast<GtkWidget*>( + g_object_get_data(G_OBJECT(dialog), kPromptTextId)); + if (widget) + return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(widget))); + return string16(); +} + +} // namespace + + +namespace content { + +ShellJavaScriptDialog::ShellJavaScriptDialog( + ShellJavaScriptDialogCreator* creator, + gfx::NativeWindow parent_window, + JavaScriptMessageType message_type, + const string16& message_text, + const string16& default_prompt_text, + const JavaScriptDialogCreator::DialogClosedCallback& callback) + : creator_(creator), + callback_(callback), + parent_window_(parent_window) { + GtkButtonsType buttons = GTK_BUTTONS_NONE; + GtkMessageType gtk_message_type = GTK_MESSAGE_OTHER; + + switch (message_type) { + case content::JAVASCRIPT_MESSAGE_TYPE_ALERT: + buttons = GTK_BUTTONS_NONE; + gtk_message_type = GTK_MESSAGE_WARNING; + break; + + case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM: + buttons = GTK_BUTTONS_CANCEL; + gtk_message_type = GTK_MESSAGE_QUESTION; + break; + + case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT: + buttons = GTK_BUTTONS_CANCEL; + gtk_message_type = GTK_MESSAGE_QUESTION; + break; + + default: + NOTREACHED(); + } + + gtk_dialog_ = gtk_message_dialog_new(parent_window_, + GTK_DIALOG_MODAL, + gtk_message_type, + buttons, + "%s", + UTF16ToUTF8(message_text).c_str()); + g_signal_connect(gtk_dialog_, + "delete-event", + G_CALLBACK(gtk_widget_hide_on_delete), + NULL); + gtk_window_set_title(GTK_WINDOW(gtk_dialog_), "JavaScript"); + + GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_), + GTK_STOCK_OK, + GTK_RESPONSE_OK); + + if (message_type != content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) + gtk_widget_grab_focus(ok_button); + + if (message_type == content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) { + GtkWidget* content_area = + gtk_dialog_get_content_area(GTK_DIALOG(gtk_dialog_)); + GtkWidget* text_box = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(text_box), + UTF16ToUTF8(default_prompt_text).c_str()); + gtk_box_pack_start(GTK_BOX(content_area), text_box, TRUE, TRUE, 0); + g_object_set_data(G_OBJECT(gtk_dialog_), kPromptTextId, text_box); + gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE); + } + + gtk_dialog_set_default_response(GTK_DIALOG(gtk_dialog_), GTK_RESPONSE_OK); + g_signal_connect(gtk_dialog_, "response", G_CALLBACK(OnResponseThunk), this); + gtk_widget_show_all(GTK_WIDGET(gtk_dialog_)); +} + +ShellJavaScriptDialog::~ShellJavaScriptDialog() { +} + +void ShellJavaScriptDialog::Cancel() { +} + +void ShellJavaScriptDialog::OnResponse(GtkWidget* dialog, int response_id) { + switch (response_id) { + case GTK_RESPONSE_OK: + callback_.Run(true, GetPromptText(GTK_DIALOG(dialog))); + break; + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_DELETE_EVENT: + callback_.Run(false, string16()); + break; + default: + NOTREACHED(); + } + + gtk_widget_destroy(dialog); + + creator_->DialogClosed(this); +} + +} // namespace content diff --git a/content/shell/shell_javascript_dialog_mac.mm b/content/shell/shell_javascript_dialog_mac.mm index 584ee03..1aa0840 100644 --- a/content/shell/shell_javascript_dialog_mac.mm +++ b/content/shell/shell_javascript_dialog_mac.mm @@ -87,6 +87,7 @@ namespace content { ShellJavaScriptDialog::ShellJavaScriptDialog( ShellJavaScriptDialogCreator* creator, + gfx::NativeWindow parent_window, JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, diff --git a/content/shell/shell_javascript_dialog_win.cc b/content/shell/shell_javascript_dialog_win.cc index 065d0bb..93c78da 100644 --- a/content/shell/shell_javascript_dialog_win.cc +++ b/content/shell/shell_javascript_dialog_win.cc @@ -77,6 +77,7 @@ INT_PTR CALLBACK ShellJavaScriptDialog::DialogProc(HWND dialog, ShellJavaScriptDialog::ShellJavaScriptDialog( ShellJavaScriptDialogCreator* creator, + gfx::NativeWindow parent_window, JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, |