[GTK] Use a single signal for script dialogs in WebKit2 GTK+ API
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Mar 2012 09:26:13 +0000 (09:26 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Mar 2012 09:26:13 +0000 (09:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80271

Reviewed by Martin Robinson.

Add a new signal WebKitWebView::script-dialog that passes a
WebKitScriptDialog boxed type that can be used to build the dialog
and set the responses. It simplifies the API and makes it bindings
friendly.

* GNUmakefile.am:
* UIProcess/API/gtk/WebKitScriptDialog.cpp: Added.
(webkitScriptDialogCopy): Copy method for boxed type.
(webkitScriptDialogFree): Free method for boxed type.
(webkit_script_dialog_get_dialog_type): Return the type of dialog:
alert, confirm or prompt.
(webkit_script_dialog_get_message): Return the message of the dialog.
(webkit_script_dialog_confirm_set_confirmed): Set whether user
confirmed the dialog, for confirm dialogs.
(webkit_script_dialog_prompt_get_default_text): Get the default
text of prompt dialogs.
(webkit_script_dialog_prompt_set_text): Set the text entered by
the user, for prompt dialogs.
* UIProcess/API/gtk/WebKitScriptDialog.h: Added.
* UIProcess/API/gtk/WebKitScriptDialogPrivate.h: Added.
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewScriptDialog): Default implementation of
WebKitWebView::script-dialog signal.
(webkit_web_view_class_init): Add WebKitWebView::script-dialog and
remove alert, confirm and propmpt.
(webkitWebViewRunJavaScriptAlert): Create a WebKitScriptDialog and
emit WebKitWebView::script-dialog signal.
(webkitWebViewRunJavaScriptConfirm): Ditto.
(webkitWebViewRunJavaScriptPrompt): Ditto.
* UIProcess/API/gtk/WebKitWebView.h:
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new
symbols.
* UIProcess/API/gtk/docs/webkit2gtk.types: Add webkit_script_dialog_get_type().
* UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
(testWebViewJavaScriptDialogs): Update javascript dialog test to
use the new API.
* UIProcess/API/gtk/webkit2marshal.list:
* UIProcess/API/gtk/webkit2.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@109880 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebKit2/ChangeLog
Source/WebKit2/GNUmakefile.am
Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.cpp [new file with mode: 0644]
Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialogPrivate.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h
Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types
Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp
Source/WebKit2/UIProcess/API/gtk/webkit2.h
Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list

index c599453..1293ef5 100644 (file)
@@ -1,3 +1,49 @@
+2012-03-06  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Use a single signal for script dialogs in WebKit2 GTK+ API
+        https://bugs.webkit.org/show_bug.cgi?id=80271
+
+        Reviewed by Martin Robinson.
+
+        Add a new signal WebKitWebView::script-dialog that passes a
+        WebKitScriptDialog boxed type that can be used to build the dialog
+        and set the responses. It simplifies the API and makes it bindings
+        friendly.
+
+        * GNUmakefile.am:
+        * UIProcess/API/gtk/WebKitScriptDialog.cpp: Added.
+        (webkitScriptDialogCopy): Copy method for boxed type.
+        (webkitScriptDialogFree): Free method for boxed type.
+        (webkit_script_dialog_get_dialog_type): Return the type of dialog:
+        alert, confirm or prompt.
+        (webkit_script_dialog_get_message): Return the message of the dialog.
+        (webkit_script_dialog_confirm_set_confirmed): Set whether user
+        confirmed the dialog, for confirm dialogs.
+        (webkit_script_dialog_prompt_get_default_text): Get the default
+        text of prompt dialogs.
+        (webkit_script_dialog_prompt_set_text): Set the text entered by
+        the user, for prompt dialogs.
+        * UIProcess/API/gtk/WebKitScriptDialog.h: Added.
+        * UIProcess/API/gtk/WebKitScriptDialogPrivate.h: Added.
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewScriptDialog): Default implementation of
+        WebKitWebView::script-dialog signal.
+        (webkit_web_view_class_init): Add WebKitWebView::script-dialog and
+        remove alert, confirm and propmpt.
+        (webkitWebViewRunJavaScriptAlert): Create a WebKitScriptDialog and
+        emit WebKitWebView::script-dialog signal.
+        (webkitWebViewRunJavaScriptConfirm): Ditto.
+        (webkitWebViewRunJavaScriptPrompt): Ditto.
+        * UIProcess/API/gtk/WebKitWebView.h:
+        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new
+        symbols.
+        * UIProcess/API/gtk/docs/webkit2gtk.types: Add webkit_script_dialog_get_type().
+        * UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
+        (testWebViewJavaScriptDialogs): Update javascript dialog test to
+        use the new API.
+        * UIProcess/API/gtk/webkit2marshal.list:
+        * UIProcess/API/gtk/webkit2.h:
+
 2012-03-05  Gavin Barraclough  <barraclough@apple.com>
 
         putByIndex should throw in strict mode
index 9125ffa..613ebb4 100644 (file)
@@ -94,6 +94,7 @@ libwebkit2gtkinclude_HEADERS = \
        $(WebKit2)/UIProcess/API/gtk/WebKitPolicyDecision.h \
        $(WebKit2)/UIProcess/API/gtk/WebKitPrintOperation.h \
        $(WebKit2)/UIProcess/API/gtk/WebKitResponsePolicyDecision.h \
+       $(WebKit2)/UIProcess/API/gtk/WebKitScriptDialog.h \
        $(WebKit2)/UIProcess/API/gtk/WebKitSettings.h \
        $(WebKit2)/UIProcess/API/gtk/WebKitURIRequest.h \
        $(WebKit2)/UIProcess/API/gtk/WebKitURIResponse.h \
@@ -564,6 +565,9 @@ webkit2_sources += \
        Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecision.cpp \
        Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecision.h \
        Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecisionPrivate.h \
+       Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.cpp \
+       Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.h \
+       Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialogPrivate.h \
        Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp \
        Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h \
        Source/WebKit2/UIProcess/API/gtk/WebKitSettingsPrivate.h \
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.cpp
new file mode 100644 (file)
index 0000000..863665d
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "WebKitScriptDialog.h"
+
+#include "WebKitScriptDialogPrivate.h"
+
+static WebKitScriptDialog* webkitScriptDialogCopy(WebKitScriptDialog* dialog)
+{
+    WebKitScriptDialog* copy = g_slice_new0(WebKitScriptDialog);
+    new (copy) WebKitScriptDialog(dialog);
+    return copy;
+}
+
+static void webkitScriptDialogFree(WebKitScriptDialog* dialog)
+{
+    dialog->~WebKitScriptDialog();
+    g_slice_free(WebKitScriptDialog, dialog);
+}
+
+G_DEFINE_BOXED_TYPE(WebKitScriptDialog, webkit_script_dialog, webkitScriptDialogCopy, webkitScriptDialogFree)
+
+/**
+ * webkit_script_dialog_get_dialog_type:
+ * @dialog: a #WebKitScriptDialog
+ *
+ * Get the dialog type of a #WebKitScriptDialog.
+ *
+ * Returns: the #WebKitScriptDialogType of @dialog
+ */
+WebKitScriptDialogType webkit_script_dialog_get_dialog_type(WebKitScriptDialog* dialog)
+{
+    g_return_val_if_fail(dialog, WEBKIT_SCRIPT_DIALOG_ALERT);
+
+    return static_cast<WebKitScriptDialogType>(dialog->type);
+}
+
+/**
+ * webkit_script_dialog_get_message:
+ * @dialog: a #WebKitScriptDialog
+ *
+ * Get the message of a #WebKitScriptDialog.
+ *
+ * Returns: the message of @dialog.
+ */
+const char* webkit_script_dialog_get_message(WebKitScriptDialog* dialog)
+{
+    g_return_val_if_fail(dialog, 0);
+
+    return dialog->message.data();
+}
+
+/**
+ * webkit_script_dialog_confirm_set_confirmed:
+ * @dialog: a #WebKitScriptDialog
+ * @confirmed: whether user confirmed the dialog
+ *
+ * This method is used for %WEBKIT_SCRIPT_DIALOG_CONFIRM dialogs when
+ * #WebKitWebView::script-dialog signal is emitted to set whether the user
+ * confirmed the dialog or not. The default implementation of #WebKitWebView::script-dialog
+ * signal sets %TRUE when the OK button is clicked and %FALSE otherwise.
+ * It's an error to use this method with a #WebKitScriptDialog that is not of type
+ * %WEBKIT_SCRIPT_DIALOG_CONFIRM.
+ */
+void webkit_script_dialog_confirm_set_confirmed(WebKitScriptDialog* dialog, gboolean confirmed)
+{
+    g_return_if_fail(dialog);
+    g_return_if_fail(dialog->type == WEBKIT_SCRIPT_DIALOG_CONFIRM);
+
+    dialog->confirmed = confirmed;
+}
+
+/**
+ * webkit_script_dialog_prompt_get_default_text:
+ * @dialog: a #WebKitScriptDialog
+ *
+ * Get the default text of a #WebKitScriptDialog of type %WEBKIT_SCRIPT_DIALOG_PROMPT.
+ * It's an error to use this method with a #WebKitScriptDialog that is not of type
+ * %WEBKIT_SCRIPT_DIALOG_PROMPT.
+ *
+ * Returns: the default text of @dialog
+ */
+const char* webkit_script_dialog_prompt_get_default_text(WebKitScriptDialog* dialog)
+{
+    g_return_val_if_fail(dialog, 0);
+    g_return_val_if_fail(dialog->type == WEBKIT_SCRIPT_DIALOG_PROMPT, 0);
+
+    return dialog->defaultText.data();
+}
+
+/**
+ * webkit_script_dialog_prompt_set_text:
+ * @dialog: a #WebKitScriptDialog
+ * @text: the text to set
+ *
+ * This method is used for %WEBKIT_SCRIPT_DIALOG_PROMPT dialogs when
+ * #WebKitWebView::script-dialog signal is emitted to set the text
+ * entered by the user. The default implementation of #WebKitWebView::script-dialog
+ * signal sets the text of the entry form when OK button is clicked, otherwise %NULL is set.
+ * It's an error to use this method with a #WebKitScriptDialog that is not of type
+ * %WEBKIT_SCRIPT_DIALOG_PROMPT.
+ */
+void webkit_script_dialog_prompt_set_text(WebKitScriptDialog* dialog, const char* text)
+{
+    g_return_if_fail(dialog);
+    g_return_if_fail(dialog->type == WEBKIT_SCRIPT_DIALOG_PROMPT);
+
+    dialog->text = text;
+}
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.h b/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialog.h
new file mode 100644 (file)
index 0000000..cf88535
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
+#error "Only <webkit2/webkit2.h> can be included directly."
+#endif
+
+#ifndef WebKitScriptDialog_h
+#define WebKitScriptDialog_h
+
+#include <glib-object.h>
+#include <webkit2/WebKitDefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_SCRIPT_DIALOG (webkit_script_dialog_get_type())
+
+typedef struct _WebKitScriptDialog WebKitScriptDialog;
+
+/**
+ * WebKitScriptDialogType:
+ * @WEBKIT_SCRIPT_DIALOG_ALERT: Alert script dialog, used to show a
+ * message to the user.
+ * @WEBKIT_SCRIPT_DIALOG_CONFIRM: Confirm script dialog, used to ask
+ * confirmation to the user.
+ * @WEBKIT_SCRIPT_DIALOG_PROMPT: Prompt script dialog, used to ask
+ * information to the user.
+ *
+ * Enum values used for determining the type of #WebKitScriptDialog
+ */
+typedef enum {
+    WEBKIT_SCRIPT_DIALOG_ALERT,
+    WEBKIT_SCRIPT_DIALOG_CONFIRM,
+    WEBKIT_SCRIPT_DIALOG_PROMPT
+} WebKitScriptDialogType;
+
+WEBKIT_API GType
+webkit_script_dialog_get_type                (void);
+
+WEBKIT_API WebKitScriptDialogType
+webkit_script_dialog_get_dialog_type         (WebKitScriptDialog *dialog);
+
+WEBKIT_API const gchar *
+webkit_script_dialog_get_message             (WebKitScriptDialog *dialog);
+
+WEBKIT_API void
+webkit_script_dialog_confirm_set_confirmed   (WebKitScriptDialog *dialog,
+                                              gboolean            confirmed);
+
+WEBKIT_API const gchar *
+webkit_script_dialog_prompt_get_default_text (WebKitScriptDialog *dialog);
+
+WEBKIT_API void
+webkit_script_dialog_prompt_set_text         (WebKitScriptDialog *dialog,
+                                              const gchar        *text);
+
+G_END_DECLS
+
+#endif
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialogPrivate.h b/Source/WebKit2/UIProcess/API/gtk/WebKitScriptDialogPrivate.h
new file mode 100644 (file)
index 0000000..5f1a43d
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WebKitScriptDialogPrivate_h
+#define WebKitScriptDialogPrivate_h
+
+#include "WebKitScriptDialog.h"
+#include <wtf/text/CString.h>
+
+struct _WebKitScriptDialog {
+    _WebKitScriptDialog(unsigned type, const CString& message)
+        : type(type)
+        , message(message)
+        , confirmed(false)
+    {
+    }
+
+    _WebKitScriptDialog(unsigned type, const CString& message, const CString& defaultText)
+        : type(type)
+        , message(message)
+        , defaultText(defaultText)
+        , confirmed(false)
+    {
+        ASSERT(type == WEBKIT_SCRIPT_DIALOG_PROMPT);
+    }
+
+    _WebKitScriptDialog(WebKitScriptDialog* dialog)
+        : type(dialog->type)
+        , message(dialog->message)
+        , defaultText(dialog->defaultText)
+        , confirmed(dialog->confirmed)
+        , text(dialog->text)
+    {
+    }
+
+    unsigned type;
+    CString message;
+    CString defaultText;
+
+    bool confirmed;
+    CString text;
+};
+
+#endif // WebKitScriptDialogPrivate_h
index e182abd..4f17d46 100644 (file)
@@ -30,6 +30,7 @@
 #include "WebKitPolicyClient.h"
 #include "WebKitPrintOperationPrivate.h"
 #include "WebKitPrivate.h"
+#include "WebKitScriptDialogPrivate.h"
 #include "WebKitSettingsPrivate.h"
 #include "WebKitUIClient.h"
 #include "WebKitWebContextPrivate.h"
@@ -55,9 +56,7 @@ enum {
     READY_TO_SHOW,
     CLOSE,
 
-    SCRIPT_ALERT,
-    SCRIPT_CONFIRM,
-    SCRIPT_PROMPT,
+    SCRIPT_DIALOG,
 
     DECIDE_POLICY,
 
@@ -137,32 +136,33 @@ static GtkWidget* webkitWebViewCreateJavaScriptDialog(WebKitWebView* webView, Gt
     return dialog;
 }
 
-static gboolean webkitWebViewScriptAlert(WebKitWebView* webView, const char* message)
+static gboolean webkitWebViewScriptDialog(WebKitWebView* webView, WebKitScriptDialog* scriptDialog)
 {
-    GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE, message);
-    gtk_dialog_run(GTK_DIALOG(dialog));
-    gtk_widget_destroy(dialog);
-    return TRUE;
-}
+    GtkWidget* dialog = 0;
+
+    switch (scriptDialog->type) {
+    case WEBKIT_SCRIPT_DIALOG_ALERT:
+        dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE, scriptDialog->message.data());
+        gtk_dialog_run(GTK_DIALOG(dialog));
+        break;
+    case WEBKIT_SCRIPT_DIALOG_CONFIRM:
+        dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data());
+        scriptDialog->confirmed = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK;
+        break;
+    case WEBKIT_SCRIPT_DIALOG_PROMPT:
+        dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data());
+        GtkWidget* entry = gtk_entry_new();
+        gtk_entry_set_text(GTK_ENTRY(entry), scriptDialog->defaultText.data());
+        gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry);
+        gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+        gtk_widget_show(entry);
+        if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
+            scriptDialog->text = gtk_entry_get_text(GTK_ENTRY(entry));
+        break;
+    }
 
-static gboolean webkitWebViewScriptConfirm(WebKitWebView* webView, const char* message, gboolean* confirmed)
-{
-    GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, message);
-    *confirmed = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK;
     gtk_widget_destroy(dialog);
-    return TRUE;
-}
 
-static gboolean webkitWebViewScriptPrompt(WebKitWebView* webView, const char* message, const char* defaultText, char** text)
-{
-    GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, message);
-    GtkWidget* entry = gtk_entry_new();
-    gtk_entry_set_text(GTK_ENTRY(entry), defaultText);
-    gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry);
-    gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
-    gtk_widget_show(entry);
-
-    *text = (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) ? g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))) : 0;
     return TRUE;
 }
 
@@ -288,9 +288,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
 
     webViewClass->load_failed = webkitWebViewLoadFail;
     webViewClass->create = webkitWebViewCreate;
-    webViewClass->script_alert = webkitWebViewScriptAlert;
-    webViewClass->script_confirm = webkitWebViewScriptConfirm;
-    webViewClass->script_prompt = webkitWebViewScriptPrompt;
+    webViewClass->script_dialog = webkitWebViewScriptDialog;
     webViewClass->decide_policy = webkitWebViewDecidePolicy;
 
     g_type_class_add_private(webViewClass, sizeof(WebKitWebViewPrivate));
@@ -520,75 +518,40 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
                      G_TYPE_NONE, 0);
 
     /**
-     * WebKitWebView::script-alert:
+     * WebKitWebView::script-dialog:
      * @web_view: the #WebKitWebView on which the signal is emitted
-     * @message: the message text
+     * @dialog: the #WebKitScriptDialog to show
      *
-     * Emitted when JavaScript code calls <function>window.alert</function>. If the
-     * signal is not handled a message dialog with a single Close button will be
-     * shown with the message text.
+     * Emitted when JavaScript code calls <function>window.alert</function>,
+     * <function>window.confirm</function> or <function>window.prompt</function>.
+     * The @dialog parameter should be used to build the dialog.
+     * If the signal is not handled a different dialog will be built and shown depending
+     * on the dialog type:
+     * <itemizedlist>
+     * <listitem><para>
+     *  %WEBKIT_SCRIPT_DIALOG_ALERT: message dialog with a single Close button.
+     * </para></listitem>
+     * <listitem><para>
+     *  %WEBKIT_SCRIPT_DIALOG_CONFIRM: message dialog with OK and Cancel buttons.
+     * </para></listitem>
+     * <listitem><para>
+     *  %WEBKIT_SCRIPT_DIALOG_PROMPT: message dialog with OK and Cancel buttons and
+     *  a text entry with the default text.
+     * </para></listitem>
+     * </itemizedlist>
      *
      * Returns: %TRUE to stop other handlers from being invoked for the event.
      *    %FALSE to propagate the event further.
      */
-    signals[SCRIPT_ALERT] =
-            g_signal_new("script-alert",
-                         G_TYPE_FROM_CLASS(webViewClass),
-                         G_SIGNAL_RUN_LAST,
-                         G_STRUCT_OFFSET(WebKitWebViewClass, script_alert),
-                         g_signal_accumulator_true_handled, 0,
-                         webkit_marshal_BOOLEAN__STRING,
-                         G_TYPE_BOOLEAN, 1,
-                         G_TYPE_STRING);
-
-    /**
-     * WebKitWebView::script-confirm:
-     * @web_view: the #WebKitWebView on which the signal is emitted
-     * @message: the message text
-     * @confirmed: (out): return location for confirm dialog response
-     *
-     * Emitted when JavaScript code calls <function>confirm</function>. If the
-     * signal is not handled a message dialog with OK and Cancel buttons will be
-     * shown with the message text. If OK button is clicked @confirmed will be
-     * set to %TRUE, otherwise it will be %FALSE.
-     *
-     * Returns: %TRUE to stop other handlers from being invoked for the event.
-     *    %FALSE to propagate the event further.
-     */
-    signals[SCRIPT_CONFIRM] =
-            g_signal_new("script-confirm",
-                         G_TYPE_FROM_CLASS(webViewClass),
-                         G_SIGNAL_RUN_LAST,
-                         G_STRUCT_OFFSET(WebKitWebViewClass, script_confirm),
-                         g_signal_accumulator_true_handled, 0,
-                         webkit_marshal_BOOLEAN__STRING_POINTER,
-                         G_TYPE_BOOLEAN, 2,
-                         G_TYPE_STRING, G_TYPE_POINTER);
-
-    /**
-     * WebKitWebView::script-prompt:
-     * @web_view: the #WebKitWebView on which the signal is emitted
-     * @message: the message text
-     * @default (allow-none): the default text
-     * @text: (out): return location for prompt dialog text response
-     *
-     * Emitted when JavaScript code calls <function>prompt</function>. If the
-     * signal is not handled a message dialog with OK and Cancel buttons and
-     * a text entry will be shown with the message text. If OK button is clicked
-     * @text will contain the text entered by the user, otherwise it will be %NULL.
-     *
-     * Returns: %TRUE to stop other handlers from being invoked for the event.
-     *    %FALSE to propagate the event further.
-     */
-    signals[SCRIPT_PROMPT] =
-            g_signal_new("script-prompt",
-                         G_TYPE_FROM_CLASS(webViewClass),
-                         G_SIGNAL_RUN_LAST,
-                         G_STRUCT_OFFSET(WebKitWebViewClass, script_prompt),
-                         g_signal_accumulator_true_handled, 0,
-                         webkit_marshal_BOOLEAN__STRING_STRING_POINTER,
-                         G_TYPE_BOOLEAN, 3,
-                         G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+    signals[SCRIPT_DIALOG] =
+        g_signal_new("script-dialog",
+                     G_TYPE_FROM_CLASS(webViewClass),
+                     G_SIGNAL_RUN_LAST,
+                     G_STRUCT_OFFSET(WebKitWebViewClass, script_dialog),
+                     g_signal_accumulator_true_handled, 0,
+                     webkit_marshal_BOOLEAN__BOXED,
+                     G_TYPE_BOOLEAN, 1,
+                     WEBKIT_TYPE_SCRIPT_DIALOG | G_SIGNAL_TYPE_STATIC_SCOPE);
 
     /**
      * WebKitWebView::decide-policy:
@@ -805,23 +768,25 @@ void webkitWebViewClosePage(WebKitWebView* webView)
 
 void webkitWebViewRunJavaScriptAlert(WebKitWebView* webView, const CString& message)
 {
+    WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_ALERT, message);
     gboolean returnValue;
-    g_signal_emit(webView, signals[SCRIPT_ALERT], 0, message.data(), &returnValue);
+    g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue);
 }
 
 bool webkitWebViewRunJavaScriptConfirm(WebKitWebView* webView, const CString& message)
 {
-    gboolean returnValue, confirmed;
-    g_signal_emit(webView, signals[SCRIPT_CONFIRM], 0, message.data(), &confirmed, &returnValue);
-    return confirmed;
+    WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_CONFIRM, message);
+    gboolean returnValue;
+    g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue);
+    return dialog.confirmed;
 }
 
 WKStringRef webkitWebViewRunJavaScriptPrompt(WebKitWebView* webView, const CString& message, const CString& defaultText)
 {
+    WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_PROMPT, message, defaultText);
     gboolean returnValue;
-    GOwnPtr<char> text;
-    g_signal_emit(webView, signals[SCRIPT_PROMPT], 0, message.data(), defaultText.data(), &text.outPtr(), &returnValue);
-    return text ? WKStringCreateWithUTF8CString(text.get()) : 0;
+    g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue);
+    return dialog.text.isNull() ? 0 : WKStringCreateWithUTF8CString(dialog.text.data());
 }
 
 void webkitWebViewMakePolicyDecision(WebKitWebView* webView, WebKitPolicyDecisionType type, WebKitPolicyDecision* decision)
index cb6b22f..a3679f7 100644 (file)
@@ -32,6 +32,7 @@
 #include <webkit2/WebKitDefines.h>
 #include <webkit2/WebKitFindController.h>
 #include <webkit2/WebKitHitTestResult.h>
+#include <webkit2/WebKitScriptDialog.h>
 #include <webkit2/WebKitSettings.h>
 #include <webkit2/WebKitURIRequest.h>
 #include <webkit2/WebKitWebContext.h>
@@ -128,15 +129,9 @@ struct _WebKitWebViewClass {
     void       (* ready_to_show)        (WebKitWebView             *web_view);
     void       (* close)                (WebKitWebView             *web_view);
 
-    gboolean   (* script_alert)         (WebKitWebView             *web_view,
-                                         const gchar               *message);
-    gboolean   (* script_confirm)       (WebKitWebView             *web_view,
-                                         const gchar               *message,
-                                         gboolean                  *confirmed);
-    gboolean   (* script_prompt)        (WebKitWebView             *web_view,
-                                         const gchar               *message,
-                                         const gchar               *default_text,
-                                         gchar                    **text);
+    gboolean   (* script_dialog)        (WebKitWebView             *web_view,
+                                         WebKitScriptDialog        *dialog);
+
     gboolean   (* decide_policy)        (WebKitWebView             *web_view,
                                          WebKitPolicyDecision      *decision,
                                          WebKitPolicyDecisionType   type);
index 49b43c0..a8f5408 100644 (file)
@@ -49,6 +49,8 @@ webkit_web_context_get_type
 WebKitWebView
 WebKitLoadEvent
 WebKitPolicyDecisionType
+WebKitScriptDialog
+WebKitScriptDialogType
 
 <SUBSECTION Editing Commands>
 WEBKIT_EDITING_COMMAND_CUT
@@ -87,6 +89,11 @@ webkit_web_view_can_execute_editing_command
 webkit_web_view_can_execute_editing_command_finish
 webkit_web_view_execute_editing_command
 webkit_web_view_get_find_controller
+webkit_script_dialog_get_dialog_type
+webkit_script_dialog_get_message
+webkit_script_dialog_confirm_set_confirmed
+webkit_script_dialog_prompt_get_default_text
+webkit_script_dialog_prompt_set_text
 
 <SUBSECTION Standard>
 WebKitWebViewClass
@@ -96,9 +103,11 @@ WEBKIT_TYPE_WEB_VIEW
 WEBKIT_WEB_VIEW_CLASS
 WEBKIT_IS_WEB_VIEW_CLASS
 WEBKIT_WEB_VIEW_GET_CLASS
+WEBKIT_TYPE_SCRIPT_DIALOG
 
 <SUBSECTION Private>
 webkit_web_view_get_type
+webkit_script_dialog_get_type
 WebKitWebViewPrivate
 </SECTION>
 
index 2e0f500..8e8d7b1 100644 (file)
@@ -10,3 +10,4 @@ webkit_uri_request_get_type
 webkit_window_properties_get_type
 webkit_download_get_type
 webkit_find_controller_get_type
+webkit_script_dialog_get_type
index 269908b..bfeda16 100644 (file)
@@ -104,12 +104,6 @@ public:
         Close
     };
 
-    enum ScriptType {
-        Alert,
-        Confirm,
-        Prompt
-    };
-
     class WindowProperties {
     public:
         WindowProperties()
@@ -224,43 +218,52 @@ public:
         return newWebView;
     }
 
-    static gboolean scriptAlert(WebKitWebView*, const char* message, UIClientTest* test)
+    void scriptAlert(WebKitScriptDialog* dialog)
     {
-        switch (test->m_scriptType) {
-        case UIClientTest::Alert:
-            g_assert_cmpstr(message, ==, kAlertDialogMessage);
+        switch (m_scriptDialogType) {
+        case WEBKIT_SCRIPT_DIALOG_ALERT:
+            g_assert_cmpstr(webkit_script_dialog_get_message(dialog), ==, kAlertDialogMessage);
             break;
-        case UIClientTest::Confirm:
-            g_assert(test->m_scriptDialogConfirmed);
-            g_assert_cmpstr(message, ==, "confirmed");
+        case WEBKIT_SCRIPT_DIALOG_CONFIRM:
+            g_assert(m_scriptDialogConfirmed);
+            g_assert_cmpstr(webkit_script_dialog_get_message(dialog), ==, "confirmed");
 
             break;
-        case UIClientTest::Prompt:
-            g_assert_cmpstr(message, ==, kPromptDialogReturnedText);
+        case WEBKIT_SCRIPT_DIALOG_PROMPT:
+            g_assert_cmpstr(webkit_script_dialog_get_message(dialog), ==, kPromptDialogReturnedText);
             break;
         }
 
-        g_main_loop_quit(test->m_mainLoop);
-
-        return TRUE;
+        g_main_loop_quit(m_mainLoop);
     }
 
-    static gboolean scriptConfirm(WebKitWebView*, const char* message, gboolean* confirmed, UIClientTest* test)
+    void scriptConfirm(WebKitScriptDialog* dialog)
     {
-        g_assert_cmpstr(message, ==, kConfirmDialogMessage);
-        g_assert(confirmed);
-        test->m_scriptDialogConfirmed = !test->m_scriptDialogConfirmed;
-        *confirmed = test->m_scriptDialogConfirmed;
+        g_assert_cmpstr(webkit_script_dialog_get_message(dialog), ==, kConfirmDialogMessage);
+        m_scriptDialogConfirmed = !m_scriptDialogConfirmed;
+        webkit_script_dialog_confirm_set_confirmed(dialog, m_scriptDialogConfirmed);
+    }
 
-        return TRUE;
+    void scriptPrompt(WebKitScriptDialog* dialog)
+    {
+        g_assert_cmpstr(webkit_script_dialog_get_message(dialog), ==, kPromptDialogMessage);
+        g_assert_cmpstr(webkit_script_dialog_prompt_get_default_text(dialog), ==, "default");
+        webkit_script_dialog_prompt_set_text(dialog, kPromptDialogReturnedText);
     }
 
-    static gboolean scriptPrompt(WebKitWebView*, const char* message, const char* defaultText, char **text, UIClientTest* test)
+    static gboolean scriptDialog(WebKitWebView*, WebKitScriptDialog* dialog, UIClientTest* test)
     {
-        g_assert_cmpstr(message, ==, kPromptDialogMessage);
-        g_assert_cmpstr(defaultText, ==, "default");
-        g_assert(text);
-        *text = g_strdup(kPromptDialogReturnedText);
+        switch (webkit_script_dialog_get_dialog_type(dialog)) {
+        case WEBKIT_SCRIPT_DIALOG_ALERT:
+            test->scriptAlert(dialog);
+            break;
+        case WEBKIT_SCRIPT_DIALOG_CONFIRM:
+            test->scriptConfirm(dialog);
+            break;
+        case WEBKIT_SCRIPT_DIALOG_PROMPT:
+            test->scriptPrompt(dialog);
+            break;
+        }
 
         return TRUE;
     }
@@ -276,15 +279,13 @@ public:
     }
 
     UIClientTest()
-        : m_scriptType(Alert)
+        : m_scriptDialogType(WEBKIT_SCRIPT_DIALOG_ALERT)
         , m_scriptDialogConfirmed(true)
         , m_mouseTargetModifiers(0)
     {
         webkit_settings_set_javascript_can_open_windows_automatically(webkit_web_view_get_settings(m_webView), TRUE);
         g_signal_connect(m_webView, "create", G_CALLBACK(viewCreate), this);
-        g_signal_connect(m_webView, "script-alert", G_CALLBACK(scriptAlert), this);
-        g_signal_connect(m_webView, "script-confirm", G_CALLBACK(scriptConfirm), this);
-        g_signal_connect(m_webView, "script-prompt", G_CALLBACK(scriptPrompt), this);
+        g_signal_connect(m_webView, "script-dialog", G_CALLBACK(scriptDialog), this);
         g_signal_connect(m_webView, "mouse-target-changed", G_CALLBACK(mouseTargetChanged), this);
     }
 
@@ -311,7 +312,7 @@ public:
     }
 
     Vector<WebViewEvents> m_webViewEvents;
-    ScriptType m_scriptType;
+    WebKitScriptDialogType m_scriptDialogType;
     bool m_scriptDialogConfirmed;
     WindowProperties m_windowProperties;
     HashSet<WTF::String> m_windowPropertiesChanged;
@@ -338,19 +339,19 @@ static void testWebViewJavaScriptDialogs(UIClientTest* test, gconstpointer)
     static const char* jsConfirmFormat = "do { confirmed = confirm('%s'); } while (!confirmed); alert('confirmed');";
     static const char* jsPromptFormat = "alert(prompt('%s', 'default'));";
 
-    test->m_scriptType = UIClientTest::Alert;
+    test->m_scriptDialogType = WEBKIT_SCRIPT_DIALOG_ALERT;
     GOwnPtr<char> alertDialogMessage(g_strdup_printf(jsAlertFormat, kAlertDialogMessage));
     GOwnPtr<char> alertHTML(g_strdup_printf(htmlOnLoadFormat, alertDialogMessage.get()));
     test->loadHtml(alertHTML.get(), 0);
     test->waitUntilMainLoopFinishes();
 
-    test->m_scriptType = UIClientTest::Confirm;
+    test->m_scriptDialogType = WEBKIT_SCRIPT_DIALOG_CONFIRM;
     GOwnPtr<char> confirmDialogMessage(g_strdup_printf(jsConfirmFormat, kConfirmDialogMessage));
     GOwnPtr<char> confirmHTML(g_strdup_printf(htmlOnLoadFormat, confirmDialogMessage.get()));
     test->loadHtml(confirmHTML.get(), 0);
     test->waitUntilMainLoopFinishes();
 
-    test->m_scriptType = UIClientTest::Prompt;
+    test->m_scriptDialogType = WEBKIT_SCRIPT_DIALOG_PROMPT;
     GOwnPtr<char> promptDialogMessage(g_strdup_printf(jsPromptFormat, kPromptDialogMessage));
     GOwnPtr<char> promptHTML(g_strdup_printf(htmlOnLoadFormat, promptDialogMessage.get()));
     test->loadHtml(promptHTML.get(), 0);
index dd345a5..0a807bc 100644 (file)
@@ -33,6 +33,7 @@
 #include <webkit2/WebKitFindController.h>
 #include <webkit2/WebKitHitTestResult.h>
 #include <webkit2/WebKitPrintOperation.h>
+#include <webkit2/WebKitScriptDialog.h>
 #include <webkit2/WebKitSettings.h>
 #include <webkit2/WebKitURIRequest.h>
 #include <webkit2/WebKitURIResponse.h>
index a0c2b5d..5f73560 100644 (file)
@@ -1,9 +1,8 @@
+BOOLEAN:BOXED
 BOOLEAN:ENUM,STRING,POINTER
 BOOLEAN:OBJECT
 BOOLEAN:OBJECT,ENUM
 BOOLEAN:STRING
-BOOLEAN:STRING,POINTER
-BOOLEAN:STRING,STRING,POINTER
 OBJECT:VOID
 VOID:OBJECT,UINT
 VOID:OBJECT,POINTER