Changeset 236004 in webkit


Ignore:
Timestamp:
Sep 14, 2018 4:01:06 AM (6 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Make script dialogs modal to the current web view only
https://bugs.webkit.org/show_bug.cgi?id=189545

Reviewed by Michael Catanzaro.

Source/WebCore/platform/gtk/po:

  • POTFILES.in:

Source/WebKit:

Change the default implementation of script dialogs to use an embedded window, like the HTTP auth dialog,
instead of a GtkMessageDialog. This patch adds a base class WebKitWebViewDialog shared by
WebKitAuthenticationDialog and the new WebKitScriptDialogImpl.

  • SourcesGTK.txt: Add new files to compilation.
  • UIProcess/API/glib/WebKitScriptDialogPrivate.h:
  • UIProcess/API/gtk/WebKitAuthenticationDialog.cpp:

(webkitAuthenticationDialogInitialize): Do not use a frame and use a better styled title.
(webkit_authentication_dialog_class_init): Remove implementation of vfuncs that are now implemented by the
parent.

  • UIProcess/API/gtk/WebKitAuthenticationDialog.h:
  • UIProcess/API/gtk/WebKitScriptDialogGtk.cpp:

(webkitScriptDialogAccept): Use WebKitScriptDialogImpl API.
(webkitScriptDialogDismiss): Ditto.
(webkitScriptDialogSetUserInput): Ditto.

  • UIProcess/API/gtk/WebKitScriptDialogImpl.cpp: Added.

(webkitScriptDialogImplClose):
(webkitScriptDialogImplKeyPressEvent):
(webkitScriptDialogImplMap):
(webkitScriptDialogImplConstructed):
(webkitScriptDialogImplDispose):
(webkit_script_dialog_impl_class_init):
(webkitScriptDialogImplAddButton):
(webkitScriptDialogImplNew):
(webkitScriptDialogImplCancel):
(webkitScriptDialogImplConfirm):
(webkitScriptDialogImplSetEntryText):

  • UIProcess/API/gtk/WebKitScriptDialogImpl.h: Added.
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewChildIsInternalWidget): Rename authenticationDialog as just dialog.
(webkitWebViewBaseAddDialog): Ditto.
(webkitWebViewBaseContainerRemove): Ditto.
(webkitWebViewBaseContainerForall): Ditto.
(webkitWebViewBaseConstructed): Ditto.
(webkitWebViewBaseSizeAllocate): Ditto.
(webkitWebViewBaseKeyPressEvent): Ditto.
(webkitWebViewBaseHandleMouseEvent): Ditto.
(webkitWebViewBaseButtonPressEvent): Ditto.
(webkitWebViewBaseButtonReleaseEvent): Ditto.
(webkitWebViewBaseHandleWheelEvent): Ditto.
(webkitWebViewBaseScrollEvent): Ditto.
(webkitWebViewBaseMotionNotifyEvent): Ditto.
(webkitWebViewBaseCrossingNotifyEvent): Ditto.
(webkitWebViewBaseTouchEvent): Ditto.
(webkitWebViewBaseFocus): Ditto.
(webkitWebViewBaseDestroy): Ditto.

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
  • UIProcess/API/gtk/WebKitWebViewDialog.cpp: Added.

(webkitWebViewDialogDraw):
(webkitWebViewDialogSizeAllocate):
(webkitWebViewDialogConstructed):
(webkit_web_view_dialog_class_init):

  • UIProcess/API/gtk/WebKitWebViewDialog.h: Added.
  • UIProcess/API/gtk/WebKitWebViewGtk.cpp:

(webkitWebViewAuthenticate):
(webkitWebViewScriptDialog):

Location:
trunk/Source
Files:
4 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/platform/gtk/po/ChangeLog

    r234926 r236004  
     12018-09-14  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Make script dialogs modal to the current web view only
     4        https://bugs.webkit.org/show_bug.cgi?id=189545
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * POTFILES.in:
     9
    1102018-08-16  Piotr Drąg  <piotrdrag@gmail.com>
    211
  • trunk/Source/WebCore/platform/gtk/po/POTFILES.in

    r229199 r236004  
    3030../../../WebKit/UIProcess/API/gtk/WebKitPrintCustomWidget.cpp
    3131../../../WebKit/UIProcess/API/gtk/WebKitPrintOperation.cpp
    32 ../../../WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp
     32../../../WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.cpp
    3333../../../WebKit/UIProcess/API/gtk/WebKitWebInspector.cpp
    3434../../../WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp
  • trunk/Source/WebKit/ChangeLog

    r235995 r236004  
     12018-09-14  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Make script dialogs modal to the current web view only
     4        https://bugs.webkit.org/show_bug.cgi?id=189545
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        Change the default implementation of script dialogs to use an embedded window, like the HTTP auth dialog,
     9        instead of a GtkMessageDialog. This patch adds a base class WebKitWebViewDialog shared by
     10        WebKitAuthenticationDialog and the new WebKitScriptDialogImpl.
     11
     12        * SourcesGTK.txt: Add new files to compilation.
     13        * UIProcess/API/glib/WebKitScriptDialogPrivate.h:
     14        * UIProcess/API/gtk/WebKitAuthenticationDialog.cpp:
     15        (webkitAuthenticationDialogInitialize): Do not use a frame and use a better styled title.
     16        (webkit_authentication_dialog_class_init): Remove implementation of vfuncs that are now implemented by the
     17        parent.
     18        * UIProcess/API/gtk/WebKitAuthenticationDialog.h:
     19        * UIProcess/API/gtk/WebKitScriptDialogGtk.cpp:
     20        (webkitScriptDialogAccept): Use WebKitScriptDialogImpl API.
     21        (webkitScriptDialogDismiss): Ditto.
     22        (webkitScriptDialogSetUserInput): Ditto.
     23        * UIProcess/API/gtk/WebKitScriptDialogImpl.cpp: Added.
     24        (webkitScriptDialogImplClose):
     25        (webkitScriptDialogImplKeyPressEvent):
     26        (webkitScriptDialogImplMap):
     27        (webkitScriptDialogImplConstructed):
     28        (webkitScriptDialogImplDispose):
     29        (webkit_script_dialog_impl_class_init):
     30        (webkitScriptDialogImplAddButton):
     31        (webkitScriptDialogImplNew):
     32        (webkitScriptDialogImplCancel):
     33        (webkitScriptDialogImplConfirm):
     34        (webkitScriptDialogImplSetEntryText):
     35        * UIProcess/API/gtk/WebKitScriptDialogImpl.h: Added.
     36        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     37        (webkitWebViewChildIsInternalWidget): Rename authenticationDialog as just dialog.
     38        (webkitWebViewBaseAddDialog): Ditto.
     39        (webkitWebViewBaseContainerRemove): Ditto.
     40        (webkitWebViewBaseContainerForall): Ditto.
     41        (webkitWebViewBaseConstructed): Ditto.
     42        (webkitWebViewBaseSizeAllocate): Ditto.
     43        (webkitWebViewBaseKeyPressEvent): Ditto.
     44        (webkitWebViewBaseHandleMouseEvent): Ditto.
     45        (webkitWebViewBaseButtonPressEvent): Ditto.
     46        (webkitWebViewBaseButtonReleaseEvent): Ditto.
     47        (webkitWebViewBaseHandleWheelEvent): Ditto.
     48        (webkitWebViewBaseScrollEvent): Ditto.
     49        (webkitWebViewBaseMotionNotifyEvent): Ditto.
     50        (webkitWebViewBaseCrossingNotifyEvent): Ditto.
     51        (webkitWebViewBaseTouchEvent): Ditto.
     52        (webkitWebViewBaseFocus): Ditto.
     53        (webkitWebViewBaseDestroy): Ditto.
     54        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     55        * UIProcess/API/gtk/WebKitWebViewDialog.cpp: Added.
     56        (webkitWebViewDialogDraw):
     57        (webkitWebViewDialogSizeAllocate):
     58        (webkitWebViewDialogConstructed):
     59        (webkit_web_view_dialog_class_init):
     60        * UIProcess/API/gtk/WebKitWebViewDialog.h: Added.
     61        * UIProcess/API/gtk/WebKitWebViewGtk.cpp:
     62        (webkitWebViewAuthenticate):
     63        (webkitWebViewScriptDialog):
     64
    1652018-09-13  Ryan Haddad  <ryanhaddad@apple.com>
    266
  • trunk/Source/WebKit/SourcesGTK.txt

    r235521 r236004  
    192192UIProcess/API/gtk/WebKitRemoteInspectorProtocolHandler.cpp @no-unify
    193193UIProcess/API/gtk/WebKitScriptDialogGtk.cpp @no-unify
     194UIProcess/API/gtk/WebKitScriptDialogImpl.cpp @no-unify
    194195UIProcess/API/gtk/WebKitVersion.cpp @no-unify
    195196UIProcess/API/gtk/WebKitWebInspector.cpp @no-unify
    196197UIProcess/API/gtk/WebKitWebViewBase.cpp @no-unify
    197198UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp @no-unify
     199UIProcess/API/gtk/WebKitWebViewDialog.cpp @no-unify
    198200UIProcess/API/gtk/WebKitWebViewGtk.cpp @no-unify
    199201
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitScriptDialogPrivate.h

    r235969 r236004  
    2121
    2222#include "WebKitScriptDialog.h"
    23 #include "WebKitWebView.h"
    2423#include <wtf/text/CString.h>
    2524#include <wtf/text/WTFString.h>
     
    5150
    5251WebKitScriptDialog* webkitScriptDialogCreate(unsigned type, const CString& message, const CString& defaultText, Function<void(bool, const String&)>&& completionHandler);
    53 void webkitScriptDialogRun(WebKitScriptDialog*, WebKitWebView*);
    5452bool webkitScriptDialogIsRunning(WebKitScriptDialog*);
    5553void webkitScriptDialogAccept(WebKitScriptDialog*);
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitAuthenticationDialog.cpp

    r218332 r236004  
    3939    GtkWidget* defaultButton;
    4040    unsigned long authenticationCancelledID;
    41     GRefPtr<GtkStyleContext> styleContext;
    4241};
    4342
    44 WEBKIT_DEFINE_TYPE(WebKitAuthenticationDialog, webkit_authentication_dialog, GTK_TYPE_EVENT_BOX)
     43WEBKIT_DEFINE_TYPE(WebKitAuthenticationDialog, webkit_authentication_dialog, WEBKIT_TYPE_WEB_VIEW_DIALOG)
    4544
    4645static void okButtonClicked(GtkButton*, WebKitAuthenticationDialog* authDialog)
     
    8382static void webkitAuthenticationDialogInitialize(WebKitAuthenticationDialog* authDialog)
    8483{
    85     GtkWidget* frame = gtk_frame_new(0);
    86     gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
    87 
    88     GtkWidget* vBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
    89     gtk_container_set_border_width(GTK_CONTAINER(vBox), 12);
    90 
    91     GtkWidget* label = gtk_label_new(nullptr);
    92     // Title of the HTTP authentication dialog.
    93     GUniquePtr<char> title(g_strdup_printf("<b>%s</b>", _("Authentication Required")));
    94     gtk_label_set_markup(GTK_LABEL(label), title.get());
    95     gtk_widget_set_halign(label, GTK_ALIGN_CENTER);
    96     gtk_widget_show(label);
    97     gtk_box_pack_start(GTK_BOX(vBox), label, FALSE, FALSE, 0);
     84    GtkWidget* vBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
     85
     86    GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
     87    gtk_style_context_add_class(gtk_widget_get_style_context(box), GTK_STYLE_CLASS_TITLEBAR);
     88    gtk_widget_set_size_request(box, -1, 16);
     89    GtkWidget* title = gtk_label_new(_("Authentication Required"));
     90    gtk_widget_set_margin_top(title, 6);
     91    gtk_widget_set_margin_bottom(title, 6);
     92    gtk_style_context_add_class(gtk_widget_get_style_context(title), GTK_STYLE_CLASS_TITLE);
     93    gtk_box_set_center_widget(GTK_BOX(box), title);
     94    gtk_widget_show(title);
     95    gtk_box_pack_start(GTK_BOX(vBox), box, TRUE, FALSE, 0);
     96    gtk_widget_show(box);
    9897
    9998    GtkWidget* buttonBox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    100     gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_END);
    101     gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 5);
    102     gtk_box_set_spacing(GTK_BOX(buttonBox), 6);
     99    gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_EXPAND);
     100    gtk_widget_set_hexpand(buttonBox, TRUE);
     101    gtk_style_context_add_class(gtk_widget_get_style_context(buttonBox), "dialog-action-area");
    103102
    104103    GtkWidget* button = gtk_button_new_with_mnemonic(_("_Cancel"));
    105104    g_signal_connect(button, "clicked", G_CALLBACK(cancelButtonClicked), authDialog);
    106     gtk_box_pack_end(GTK_BOX(buttonBox), button, FALSE, TRUE, 0);
     105    gtk_box_pack_start(GTK_BOX(buttonBox), button, FALSE, TRUE, 0);
    107106    gtk_widget_show(button);
    108107
     
    115114    gtk_widget_show(button);
    116115
    117     GtkWidget* authBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
    118     gtk_container_set_border_width(GTK_CONTAINER(authBox), 5);
     116    GtkWidget* authBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
     117    gtk_widget_set_margin_start(authBox, 10);
     118    gtk_widget_set_margin_end(authBox, 10);
    119119
    120120    const WebCore::AuthenticationChallenge& challenge = webkitAuthenticationRequestGetAuthenticationChallenge(priv->request.get())->core();
     
    122122    GUniquePtr<char> prompt(g_strdup_printf(_("Authentication required by %s:%i"),
    123123        challenge.protectionSpace().host().utf8().data(), challenge.protectionSpace().port()));
    124     label = createLabelWithLineWrap(prompt.get());
     124    GtkWidget* label = createLabelWithLineWrap(prompt.get());
    125125    gtk_widget_show(label);
    126126    gtk_box_pack_start(GTK_BOX(authBox), label, FALSE, FALSE, 0);
     
    190190    gtk_widget_show(buttonBox);
    191191
    192     gtk_container_add(GTK_CONTAINER(frame), vBox);
     192    gtk_container_add(GTK_CONTAINER(authDialog), vBox);
    193193    gtk_widget_show(vBox);
    194194
    195     gtk_container_add(GTK_CONTAINER(authDialog), frame);
    196     gtk_widget_show(frame);
    197 
    198195    authDialog->priv->authenticationCancelledID = g_signal_connect(authDialog->priv->request.get(), "cancelled", G_CALLBACK(authenticationCancelled), authDialog);
    199 }
    200 
    201 static gboolean webkitAuthenticationDialogDraw(GtkWidget* widget, cairo_t* cr)
    202 {
    203     WebKitAuthenticationDialogPrivate* priv = WEBKIT_AUTHENTICATION_DIALOG(widget)->priv;
    204 
    205     cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
    206     cairo_set_source_rgba(cr, 0, 0, 0, 0.5);
    207     cairo_paint(cr);
    208 
    209     if (GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget))) {
    210         GtkAllocation allocation;
    211         gtk_widget_get_allocation(child, &allocation);
    212 
    213         gtk_style_context_save(priv->styleContext.get());
    214         gtk_style_context_add_class(priv->styleContext.get(), GTK_STYLE_CLASS_BACKGROUND);
    215         gtk_render_background(priv->styleContext.get(), cr, allocation.x, allocation.y, allocation.width, allocation.height);
    216         gtk_style_context_restore(priv->styleContext.get());
    217     }
    218 
    219     GTK_WIDGET_CLASS(webkit_authentication_dialog_parent_class)->draw(widget, cr);
    220 
    221     return FALSE;
    222196}
    223197
     
    229203
    230204    GTK_WIDGET_CLASS(webkit_authentication_dialog_parent_class)->map(widget);
    231 }
    232 
    233 static void webkitAuthenticationDialogSizeAllocate(GtkWidget* widget, GtkAllocation* allocation)
    234 {
    235     GTK_WIDGET_CLASS(webkit_authentication_dialog_parent_class)->size_allocate(widget, allocation);
    236 
    237     GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget));
    238     if (!child)
    239         return;
    240 
    241     GtkRequisition naturalSize;
    242     gtk_widget_get_preferred_size(child, 0, &naturalSize);
    243 
    244     GtkAllocation childAllocation;
    245     gtk_widget_get_allocation(child, &childAllocation);
    246 
    247     childAllocation.x += (allocation->width - naturalSize.width) / 2;
    248     childAllocation.y += (allocation->height - naturalSize.height) / 2;
    249     childAllocation.width = naturalSize.width;
    250     childAllocation.height = naturalSize.height;
    251     gtk_widget_size_allocate(child, &childAllocation);
    252 }
    253 
    254 static void webkitAuthenticationDialogConstructed(GObject* object)
    255 {
    256     G_OBJECT_CLASS(webkit_authentication_dialog_parent_class)->constructed(object);
    257 
    258     WebKitAuthenticationDialogPrivate* priv = WEBKIT_AUTHENTICATION_DIALOG(object)->priv;
    259     priv->styleContext = adoptGRef(gtk_style_context_new());
    260     GtkWidgetPath* path = gtk_widget_path_new();
    261     gtk_widget_path_append_type(path, GTK_TYPE_WINDOW);
    262     gtk_style_context_set_path(priv->styleContext.get(), path);
    263     gtk_widget_path_free(path);
    264205}
    265206
     
    278219{
    279220    GObjectClass* objectClass = G_OBJECT_CLASS(klass);
    280     objectClass->constructed = webkitAuthenticationDialogConstructed;
    281221    objectClass->dispose = webkitAuthenticationDialogDispose;
    282222
    283223    GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(klass);
    284     widgetClass->draw = webkitAuthenticationDialogDraw;
    285224    widgetClass->map = webkitAuthenticationDialogMap;
    286     widgetClass->size_allocate = webkitAuthenticationDialogSizeAllocate;
    287225}
    288226
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitAuthenticationDialog.h

    r173510 r236004  
    1818 */
    1919
    20 #ifndef WebKitAuthenticationDialog_h
    21 #define WebKitAuthenticationDialog_h
     20#pragma once
    2221
    2322#include "WebKitAuthenticationRequest.h"
     23#include "WebKitWebViewDialog.h"
    2424#include <gtk/gtk.h>
    2525
     
    4343
    4444struct _WebKitAuthenticationDialog {
    45     GtkEventBox parent;
     45    WebKitWebViewDialog parent;
    4646
    4747    WebKitAuthenticationDialogPrivate* priv;
     
    4949
    5050struct _WebKitAuthenticationDialogClass {
    51     GtkEventBoxClass parentClass;
     51    WebKitWebViewDialogClass parentClass;
    5252};
    5353
     
    5757G_END_DECLS
    5858
    59 #endif // WebKitAuthenticationDialog_h
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp

    r235969 r236004  
    2121#include "WebKitScriptDialog.h"
    2222
     23#include "WebKitScriptDialogImpl.h"
    2324#include "WebKitScriptDialogPrivate.h"
    24 #include "WebKitWebViewPrivate.h"
    25 #include <WebCore/GtkUtilities.h>
    26 #include <glib/gi18n-lib.h>
    27 #include <gtk/gtk.h>
    28 #include <wtf/glib/GUniquePtr.h>
    29 
    30 static void scriptDialogResponseCallback(GtkWidget* dialog, int responseID, WebKitScriptDialog* scriptDialog)
    31 {
    32     switch (scriptDialog->type) {
    33     case WEBKIT_SCRIPT_DIALOG_ALERT:
    34         break;
    35     case WEBKIT_SCRIPT_DIALOG_CONFIRM:
    36     case WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM:
    37         scriptDialog->confirmed = responseID == GTK_RESPONSE_OK;
    38         break;
    39     case WEBKIT_SCRIPT_DIALOG_PROMPT:
    40         if (responseID == GTK_RESPONSE_OK) {
    41             if (auto* entry = g_object_get_data(G_OBJECT(dialog), "wk-script-dialog-entry"))
    42                 scriptDialog->text = gtk_entry_get_text(GTK_ENTRY(entry));
    43         }
    44         break;
    45     }
    46 
    47     scriptDialog->nativeDialog = nullptr;
    48     webkit_script_dialog_close(scriptDialog);
    49     webkit_script_dialog_unref(scriptDialog);
    50     gtk_widget_destroy(dialog);
    51 }
    52 
    53 static GtkWidget* webkitWebViewCreateJavaScriptDialog(WebKitWebView* webView, GtkMessageType type, GtkButtonsType buttons, int defaultResponse, const char* primaryText, const char* secondaryText = nullptr)
    54 {
    55     GtkWidget* parent = gtk_widget_get_toplevel(GTK_WIDGET(webView));
    56     GtkWidget* dialog = gtk_message_dialog_new(WebCore::widgetIsOnscreenToplevelWindow(parent) ? GTK_WINDOW(parent) : nullptr,
    57         GTK_DIALOG_DESTROY_WITH_PARENT, type, buttons, "%s", primaryText);
    58     if (secondaryText)
    59         gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", secondaryText);
    60     GUniquePtr<char> title(g_strdup_printf("JavaScript - %s", webkitWebViewGetPage(webView).pageLoadState().url().utf8().data()));
    61     gtk_window_set_title(GTK_WINDOW(dialog), title.get());
    62     if (buttons != GTK_BUTTONS_NONE)
    63         gtk_dialog_set_default_response(GTK_DIALOG(dialog), defaultResponse);
    64 
    65     return dialog;
    66 }
    67 
    68 void webkitScriptDialogRun(WebKitScriptDialog* scriptDialog, WebKitWebView* webView)
    69 {
    70     GtkWidget* dialog = nullptr;
    71 
    72     switch (scriptDialog->type) {
    73     case WEBKIT_SCRIPT_DIALOG_ALERT:
    74         dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE, scriptDialog->message.data());
    75         break;
    76     case WEBKIT_SCRIPT_DIALOG_CONFIRM:
    77         dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data());
    78         break;
    79     case WEBKIT_SCRIPT_DIALOG_PROMPT: {
    80         dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data());
    81         GtkWidget* entry = gtk_entry_new();
    82         g_object_set_data(G_OBJECT(dialog), "wk-script-dialog-entry", entry);
    83         gtk_entry_set_text(GTK_ENTRY(entry), scriptDialog->defaultText.data());
    84         gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry);
    85         gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
    86         gtk_widget_show(entry);
    87         break;
    88     }
    89     case WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM:
    90         dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, GTK_RESPONSE_OK,
    91             _("Are you sure you want to leave this page?"), scriptDialog->message.data());
    92         gtk_dialog_add_buttons(GTK_DIALOG(dialog), _("Stay on Page"), GTK_RESPONSE_CLOSE, _("Leave Page"), GTK_RESPONSE_OK, nullptr);
    93         gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
    94         break;
    95     }
    96 
    97     ASSERT(dialog);
    98     scriptDialog->nativeDialog = dialog;
    99     g_signal_connect(dialog, "response", G_CALLBACK(scriptDialogResponseCallback), webkit_script_dialog_ref(scriptDialog));
    100     gtk_widget_show(dialog);
    101 }
    10225
    10326void webkitScriptDialogAccept(WebKitScriptDialog* scriptDialog)
    10427{
    105     int response = 0;
    106     switch (scriptDialog->type) {
    107     case WEBKIT_SCRIPT_DIALOG_ALERT:
    108         response = GTK_RESPONSE_CLOSE;
    109         break;
    110     case WEBKIT_SCRIPT_DIALOG_CONFIRM:
    111     case WEBKIT_SCRIPT_DIALOG_PROMPT:
    112     case WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM:
    113         response = GTK_RESPONSE_OK;
    114         break;
    115     }
    116     ASSERT(scriptDialog->nativeDialog);
    117     gtk_dialog_response(GTK_DIALOG(scriptDialog->nativeDialog), response);
     28    if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
     29        return;
     30    webkitScriptDialogImplConfirm(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog));
    11831}
    11932
    12033void webkitScriptDialogDismiss(WebKitScriptDialog* scriptDialog)
    12134{
    122     ASSERT(scriptDialog->nativeDialog);
    123     gtk_dialog_response(GTK_DIALOG(scriptDialog->nativeDialog), GTK_RESPONSE_CLOSE);
     35    if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
     36        return;
     37    webkitScriptDialogImplCancel(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog));
    12438}
    12539
    12640void webkitScriptDialogSetUserInput(WebKitScriptDialog* scriptDialog, const String& userInput)
    12741{
    128     if (scriptDialog->type != WEBKIT_SCRIPT_DIALOG_PROMPT)
     42    if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
    12943        return;
    13044
    131     ASSERT(scriptDialog->nativeDialog);
    132     GtkWidget* dialogContentArea = gtk_dialog_get_content_area(GTK_DIALOG(scriptDialog->nativeDialog));
    133     GUniquePtr<GList> children(gtk_container_get_children(GTK_CONTAINER(dialogContentArea)));
    134     for (GList* child = children.get(); child; child = g_list_next(child)) {
    135         GtkWidget* childWidget = GTK_WIDGET(child->data);
    136         if (GTK_IS_ENTRY(childWidget)) {
    137             gtk_entry_set_text(GTK_ENTRY(childWidget), userInput.utf8().data());
    138             break;
    139         }
    140     }
     45    webkitScriptDialogImplSetEntryText(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog), userInput);
    14146}
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r235560 r236004  
    4242#include "WebInspectorProxy.h"
    4343#include "WebKit2Initialize.h"
    44 #include "WebKitAuthenticationDialog.h"
    4544#include "WebKitWebViewBaseAccessible.h"
    4645#include "WebKitWebViewBasePrivate.h"
     
    168167    IntRect tooltipArea;
    169168    GRefPtr<AtkObject> accessible;
    170     GtkWidget* authenticationDialog { nullptr };
     169    GtkWidget* dialog { nullptr };
    171170    GtkWidget* inspectorView { nullptr };
    172171    AttachmentSide inspectorAttachmentSide { AttachmentSide::Bottom };
     
    402401{
    403402    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    404     return widget == priv->inspectorView || widget == priv->authenticationDialog;
     403    return widget == priv->inspectorView || widget == priv->dialog;
    405404}
    406405
     
    421420}
    422421
    423 void webkitWebViewBaseAddAuthenticationDialog(WebKitWebViewBase* webViewBase, GtkWidget* dialog)
    424 {
    425     WebKitWebViewBasePrivate* priv = webViewBase->priv;
    426     priv->authenticationDialog = dialog;
     422void webkitWebViewBaseAddDialog(WebKitWebViewBase* webViewBase, GtkWidget* dialog)
     423{
     424    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     425    priv->dialog = dialog;
    427426    gtk_container_add(GTK_CONTAINER(webViewBase), dialog);
    428427    gtk_widget_show(dialog);
     
    460459        priv->inspectorView = 0;
    461460        priv->inspectorViewSize = 0;
    462     } else if (priv->authenticationDialog == widget) {
    463         priv->authenticationDialog = 0;
     461    } else if (priv->dialog == widget) {
     462        priv->dialog = nullptr;
    464463    } else {
    465464        ASSERT(priv->children.contains(widget));
     
    483482        (*callback)(priv->inspectorView, callbackData);
    484483
    485     if (includeInternals && priv->authenticationDialog)
    486         (*callback)(priv->authenticationDialog, callbackData);
     484    if (includeInternals && priv->dialog)
     485        (*callback)(priv->dialog, callbackData);
    487486}
    488487
     
    519518    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(object)->priv;
    520519    priv->pageClient = std::make_unique<PageClientImpl>(viewWidget);
    521     priv->authenticationDialog = 0;
     520    priv->dialog = nullptr;
    522521}
    523522
     
    590589    }
    591590
    592     // The authentication dialog is centered in the view rect, which means that it
     591    // The dialogs are centered in the view rect, which means that it
    593592    // never overlaps the web inspector. Thus, we need to calculate the allocation here
    594593    // after calculating the inspector allocation.
    595     if (priv->authenticationDialog) {
     594    if (priv->dialog) {
    596595        GtkRequisition minimumSize;
    597         gtk_widget_get_preferred_size(priv->authenticationDialog, &minimumSize, nullptr);
     596        gtk_widget_get_preferred_size(priv->dialog, &minimumSize, nullptr);
    598597
    599598        GtkAllocation childAllocation = { 0, 0, std::max(minimumSize.width, viewRect.width()), std::max(minimumSize.height, viewRect.height()) };
    600         gtk_widget_size_allocate(priv->authenticationDialog, &childAllocation);
     599        gtk_widget_size_allocate(priv->dialog, &childAllocation);
    601600    }
    602601
     
    686685#endif
    687686
    688     if (priv->authenticationDialog)
     687    if (priv->dialog)
    689688        return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_press_event(widget, keyEvent);
    690689
     
    744743{
    745744    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    746     ASSERT(!priv->authenticationDialog);
     745    ASSERT(!priv->dialog);
    747746
    748747    int clickCount = 0;
     
    789788    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    790789
    791     if (priv->authenticationDialog)
     790    if (priv->dialog)
    792791        return GDK_EVENT_STOP;
    793792
     
    802801    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    803802
    804     if (priv->authenticationDialog)
     803    if (priv->dialog)
    805804        return GDK_EVENT_STOP;
    806805
     
    813812{
    814813    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    815     ASSERT(!priv->authenticationDialog);
     814    ASSERT(!priv->dialog);
    816815    if (phase)
    817816        priv->pageProxy->handleWheelEvent(NativeWebWheelEvent(event, phase.value(), momentum.value_or(WebWheelEvent::Phase::PhaseNone)));
     
    828827        return GDK_EVENT_PROPAGATE;
    829828
    830     if (priv->authenticationDialog)
     829    if (priv->dialog)
    831830        return GDK_EVENT_PROPAGATE;
    832831
     
    876875    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    877876
    878     if (priv->authenticationDialog) {
     877    if (priv->dialog) {
    879878        auto* widgetClass = GTK_WIDGET_CLASS(webkit_web_view_base_parent_class);
    880879        return widgetClass->motion_notify_event ? widgetClass->motion_notify_event(widget, event) : GDK_EVENT_PROPAGATE;
     
    891890    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    892891
    893     if (priv->authenticationDialog)
     892    if (priv->dialog)
    894893        return GDK_EVENT_PROPAGATE;
    895894
     
    986985    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    987986
    988     if (priv->authenticationDialog)
     987    if (priv->dialog)
    989988        return GDK_EVENT_STOP;
    990989
     
    12591258static gboolean webkitWebViewBaseFocus(GtkWidget* widget, GtkDirectionType direction)
    12601259{
    1261     // If the authentication dialog is active, we need to forward focus events there. This
     1260    // If a dialog is active, we need to forward focus events there. This
    12621261    // ensures that you can tab between elements in the box.
    12631262    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv;
    1264     if (priv->authenticationDialog) {
     1263    if (priv->dialog) {
    12651264        gboolean returnValue;
    1266         g_signal_emit_by_name(priv->authenticationDialog, "focus", direction, &returnValue);
     1265        g_signal_emit_by_name(priv->dialog, "focus", direction, &returnValue);
    12671266        return returnValue;
    12681267    }
     
    12741273{
    12751274    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv;
    1276     if (priv->authenticationDialog)
    1277         gtk_widget_destroy(priv->authenticationDialog);
     1275    if (priv->dialog)
     1276        gtk_widget_destroy(priv->dialog);
    12781277
    12791278    GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->destroy(widget);
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r218332 r236004  
    6262bool webkitWebViewBaseIsInWindow(WebKitWebViewBase*);
    6363
    64 void webkitWebViewBaseAddAuthenticationDialog(WebKitWebViewBase*, GtkWidget* authDialog);
    65 void webkitWebViewBaseCancelAuthenticationDialog(WebKitWebViewBase*);
     64void webkitWebViewBaseAddDialog(WebKitWebViewBase*, GtkWidget*);
    6665void webkitWebViewBaseAddWebInspector(WebKitWebViewBase*, GtkWidget* inspector, WebKit::AttachmentSide);
    6766void webkitWebViewBaseResetClickCounter(WebKitWebViewBase*);
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp

    r232150 r236004  
    2222
    2323#include "WebKitAuthenticationDialog.h"
    24 #include "WebKitScriptDialogPrivate.h"
     24#include "WebKitScriptDialogImpl.h"
    2525#include "WebKitWebViewBasePrivate.h"
    2626#include "WebKitWebViewPrivate.h"
     
    3434{
    3535    CredentialStorageMode credentialStorageMode = webkit_authentication_request_can_save_credentials(request) ? AllowPersistentStorage : DisallowPersistentStorage;
    36     webkitWebViewBaseAddAuthenticationDialog(WEBKIT_WEB_VIEW_BASE(webView), webkitAuthenticationDialogNew(request, credentialStorageMode));
     36    webkitWebViewBaseAddDialog(WEBKIT_WEB_VIEW_BASE(webView), webkitAuthenticationDialogNew(request, credentialStorageMode));
    3737
    3838    return TRUE;
     
    4141gboolean webkitWebViewScriptDialog(WebKitWebView* webView, WebKitScriptDialog* scriptDialog)
    4242{
    43     webkitScriptDialogRun(scriptDialog, webView);
     43    GUniquePtr<char> title(g_strdup_printf("JavaScript - %s", webkitWebViewGetPage(webView).pageLoadState().url().utf8().data()));
     44    webkitWebViewBaseAddDialog(WEBKIT_WEB_VIEW_BASE(webView), webkitScriptDialogImplNew(scriptDialog, title.get()));
     45
    4446    return TRUE;
    4547}
Note: See TracChangeset for help on using the changeset viewer.