Title: [262286] trunk/Source
Revision
262286
Author
[email protected]
Date
2020-05-29 02:40:52 -0700 (Fri, 29 May 2020)

Log Message

[GTK4] Implement script dialogs
https://bugs.webkit.org/show_bug.cgi?id=212318

Reviewed by Adrian Perez de Castro.

Source/WebCore:

Add more definitions to avoid ifdefs.

* platform/gtk/GtkVersioning.h:
(gtk_entry_set_text):
(gtk_entry_get_text):
(gtk_label_set_line_wrap):
(gtk_window_set_default):
(gtk_widget_add_css_class):

Source/WebKit:

Adapt to the GTK4 API and theme changes.

* UIProcess/API/gtk/WebKitScriptDialogImpl.cpp:
(webkitScriptDialogImplClose):
(webkitScriptDialogImplKeyPressed):
(webkitScriptDialogImplMap):
(webkitScriptDialogImplConstructed):
(webkitScriptDialogImplDispose):
(webkit_script_dialog_impl_class_init):
(webkitScriptDialogImplAddButton):
(webkitScriptDialogImplNew):
(webkitScriptDialogImplSetEntryText):
* UIProcess/API/gtk/WebKitScriptDialogImpl.h:
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseAddDialog):
(webkitWebViewBaseRemoveChild):
(webkitWebViewBaseSnapshot):
* UIProcess/API/gtk/WebKitWebViewDialog.cpp:
(webkitWebViewDialogSnapshot):
(webkitWebViewDialogSizeAllocate):
(webkitWebViewDialogConstructed):
(webkit_web_view_dialog_class_init):
(webkitWebViewDialogSetChild):
(webkitWebViewDialogGetChild):
* UIProcess/API/gtk/WebKitWebViewDialog.h:
* UIProcess/API/gtk/WebKitWebViewGtk.cpp:
(webkitWebViewScriptDialog):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (262285 => 262286)


--- trunk/Source/WebCore/ChangeLog	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebCore/ChangeLog	2020-05-29 09:40:52 UTC (rev 262286)
@@ -1,3 +1,19 @@
+2020-05-29  Carlos Garcia Campos  <[email protected]>
+
+        [GTK4] Implement script dialogs
+        https://bugs.webkit.org/show_bug.cgi?id=212318
+
+        Reviewed by Adrian Perez de Castro.
+
+        Add more definitions to avoid ifdefs.
+
+        * platform/gtk/GtkVersioning.h:
+        (gtk_entry_set_text):
+        (gtk_entry_get_text):
+        (gtk_label_set_line_wrap):
+        (gtk_window_set_default):
+        (gtk_widget_add_css_class):
+
 2020-05-28  Andy Estes  <[email protected]>
 
         [Apple Pay] Buttons render with a corner radius of PKApplePayButtonDefaultCornerRadius even when explicitly specifying "border-radius: 0px"

Modified: trunk/Source/WebCore/platform/gtk/GtkVersioning.h (262285 => 262286)


--- trunk/Source/WebCore/platform/gtk/GtkVersioning.h	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebCore/platform/gtk/GtkVersioning.h	2020-05-29 09:40:52 UTC (rev 262286)
@@ -87,6 +87,30 @@
     gtk_widget_queue_resize(widget);
 }
 
+static inline void
+gtk_entry_set_text(GtkEntry* entry, const char* text)
+{
+    gtk_editable_set_text(GTK_EDITABLE(entry), text);
+}
+
+static inline const char*
+gtk_entry_get_text(GtkEntry* entry)
+{
+    return gtk_editable_get_text(GTK_EDITABLE(entry));
+}
+
+static inline void
+gtk_label_set_line_wrap(GtkLabel* label, gboolean enable)
+{
+    gtk_label_set_wrap(label, enable);
+}
+
+static inline void
+gtk_window_set_default(GtkWindow* window, GtkWidget* widget)
+{
+    gtk_window_set_default_widget(window, widget);
+}
+
 static inline gboolean
 gdk_event_get_state(const GdkEvent *event, GdkModifierType *state)
 {
@@ -159,4 +183,12 @@
     return TRUE;
 }
 
+#else // USE(GTK4)
+
+static inline void
+gtk_widget_add_css_class(GtkWidget* widget, const char* name)
+{
+    gtk_style_context_add_class(gtk_widget_get_style_context(widget), name);
+}
+
 #endif // USE(GTK4)

Modified: trunk/Source/WebKit/ChangeLog (262285 => 262286)


--- trunk/Source/WebKit/ChangeLog	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/ChangeLog	2020-05-29 09:40:52 UTC (rev 262286)
@@ -1,3 +1,38 @@
+2020-05-29  Carlos Garcia Campos  <[email protected]>
+
+        [GTK4] Implement script dialogs
+        https://bugs.webkit.org/show_bug.cgi?id=212318
+
+        Reviewed by Adrian Perez de Castro.
+
+        Adapt to the GTK4 API and theme changes.
+
+        * UIProcess/API/gtk/WebKitScriptDialogImpl.cpp:
+        (webkitScriptDialogImplClose):
+        (webkitScriptDialogImplKeyPressed):
+        (webkitScriptDialogImplMap):
+        (webkitScriptDialogImplConstructed):
+        (webkitScriptDialogImplDispose):
+        (webkit_script_dialog_impl_class_init):
+        (webkitScriptDialogImplAddButton):
+        (webkitScriptDialogImplNew):
+        (webkitScriptDialogImplSetEntryText):
+        * UIProcess/API/gtk/WebKitScriptDialogImpl.h:
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseAddDialog):
+        (webkitWebViewBaseRemoveChild):
+        (webkitWebViewBaseSnapshot):
+        * UIProcess/API/gtk/WebKitWebViewDialog.cpp:
+        (webkitWebViewDialogSnapshot):
+        (webkitWebViewDialogSizeAllocate):
+        (webkitWebViewDialogConstructed):
+        (webkit_web_view_dialog_class_init):
+        (webkitWebViewDialogSetChild):
+        (webkitWebViewDialogGetChild):
+        * UIProcess/API/gtk/WebKitWebViewDialog.h:
+        * UIProcess/API/gtk/WebKitWebViewGtk.cpp:
+        (webkitWebViewScriptDialog):
+
 2020-05-29  Wenson Hsieh  <[email protected]>
 
         REGRESSION (r261812): editing/async-clipboard/clipboard-item-get-type-basic.html is flaky

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogGtk.cpp	2020-05-29 09:40:52 UTC (rev 262286)
@@ -25,37 +25,27 @@
 
 void webkitScriptDialogAccept(WebKitScriptDialog* scriptDialog)
 {
-#if !USE(GTK4)
     if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
         return;
     webkitScriptDialogImplConfirm(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog));
-#endif
 }
 
 void webkitScriptDialogDismiss(WebKitScriptDialog* scriptDialog)
 {
-#if !USE(GTK4)
     if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
         return;
     webkitScriptDialogImplCancel(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog));
-#endif
 }
 
 void webkitScriptDialogSetUserInput(WebKitScriptDialog* scriptDialog, const String& userInput)
 {
-#if !USE(GTK4)
     if (!WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog))
         return;
 
     webkitScriptDialogImplSetEntryText(WEBKIT_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog), userInput);
-#endif
 }
 
 bool webkitScriptDialogIsUserHandled(WebKitScriptDialog* scriptDialog)
 {
-#if !USE(GTK4)
     return !WEBKIT_IS_SCRIPT_DIALOG_IMPL(scriptDialog->nativeDialog);
-#else
-    return true;
-#endif
 }

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.cpp (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.cpp	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.cpp	2020-05-29 09:40:52 UTC (rev 262286)
@@ -20,9 +20,9 @@
 #include "config.h"
 #include "WebKitScriptDialogImpl.h"
 
-#if !USE(GTK4)
-
 #include "WebKitScriptDialogPrivate.h"
+#include <WebCore/GtkUtilities.h>
+#include <WebCore/GtkVersioning.h>
 #include <glib/gi18n-lib.h>
 #include <wtf/glib/WTFGType.h>
 #include <wtf/text/CString.h>
@@ -43,9 +43,24 @@
 static void webkitScriptDialogImplClose(WebKitScriptDialogImpl* dialog)
 {
     webkit_script_dialog_close(dialog->priv->dialog);
+#if USE(GTK4)
+    gtk_widget_unparent(GTK_WIDGET(dialog));
+#else
     gtk_widget_destroy(GTK_WIDGET(dialog));
+#endif
 }
 
+#if USE(GTK4)
+static gboolean webkitScriptDialogImplKeyPressed(WebKitScriptDialogImpl* dialog, unsigned keyval, unsigned, GdkModifierType, GtkEventController*)
+{
+    if (keyval == GDK_KEY_Escape) {
+        webkitScriptDialogImplClose(dialog);
+        return GDK_EVENT_STOP;
+    }
+
+    return GDK_EVENT_PROPAGATE;
+}
+#else
 static gboolean webkitScriptDialogImplKeyPressEvent(GtkWidget* widget, GdkEventKey* keyEvent)
 {
     guint keyval;
@@ -57,11 +72,14 @@
 
     return GDK_EVENT_PROPAGATE;
 }
+#endif
 
 static void webkitScriptDialogImplMap(GtkWidget* widget)
 {
     WebKitScriptDialogImplPrivate* priv = WEBKIT_SCRIPT_DIALOG_IMPL(widget)->priv;
-    gtk_widget_grab_default(priv->defaultButton);
+    auto* toplevel = gtk_widget_get_toplevel(widget);
+    if (WebCore::widgetIsOnscreenToplevelWindow(toplevel))
+        gtk_window_set_default(GTK_WINDOW(toplevel), priv->defaultButton);
 
     switch (priv->dialog->type) {
     case WEBKIT_SCRIPT_DIALOG_ALERT:
@@ -85,37 +103,64 @@
     WebKitScriptDialogImplPrivate* priv = dialog->priv;
 
     priv->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
+#if USE(GTK4)
+    webkitWebViewDialogSetChild(WEBKIT_WEB_VIEW_DIALOG(object), priv->vbox);
+    gtk_widget_add_css_class(priv->vbox, "dialog-vbox");
+#else
     gtk_container_set_border_width(GTK_CONTAINER(priv->vbox), 0);
     gtk_container_add(GTK_CONTAINER(dialog), priv->vbox);
     gtk_widget_show(priv->vbox);
+#endif
 
     GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-    gtk_style_context_add_class(gtk_widget_get_style_context(box), GTK_STYLE_CLASS_TITLEBAR);
+    gtk_widget_add_css_class(box, GTK_STYLE_CLASS_TITLEBAR);
     gtk_widget_set_size_request(box, -1, 16);
     priv->title = gtk_label_new(nullptr);
     gtk_label_set_ellipsize(GTK_LABEL(priv->title), PANGO_ELLIPSIZE_END);
     gtk_widget_set_margin_top(priv->title, 6);
     gtk_widget_set_margin_bottom(priv->title, 6);
-    gtk_style_context_add_class(gtk_widget_get_style_context(priv->title), GTK_STYLE_CLASS_TITLE);
+    gtk_widget_add_css_class(priv->title, GTK_STYLE_CLASS_TITLE);
+#if USE(GTK4)
+    gtk_widget_set_hexpand(priv->title, TRUE);
+    gtk_widget_set_halign(priv->title, GTK_ALIGN_CENTER);
+    gtk_box_append(GTK_BOX(box), priv->title);
+#else
     gtk_box_set_center_widget(GTK_BOX(box), priv->title);
     gtk_widget_show(priv->title);
+#endif
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(priv->vbox), box);
+#else
     gtk_box_pack_start(GTK_BOX(priv->vbox), box, TRUE, FALSE, 0);
     gtk_widget_show(box);
+#endif
 
     box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 30);
     gtk_widget_set_margin_start(box, 30);
     gtk_widget_set_margin_end(box, 30);
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(priv->vbox), box);
+#else
     gtk_box_pack_start(GTK_BOX(priv->vbox), box, TRUE, FALSE, 0);
     gtk_widget_show(box);
+#endif
 
     GtkWidget* messageArea = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(box), messageArea);
+#else
     gtk_box_pack_start(GTK_BOX(box), messageArea, TRUE, TRUE, 0);
     gtk_widget_show(messageArea);
+#endif
 
     priv->swindow = gtk_scrolled_window_new(nullptr, nullptr);
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(priv->swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(messageArea), priv->swindow);
+#else
     gtk_box_pack_start(GTK_BOX(messageArea), priv->swindow, TRUE, TRUE, 0);
     gtk_widget_show(priv->swindow);
+#endif
 
     priv->label = gtk_label_new(nullptr);
     gtk_widget_set_halign(priv->label, GTK_ALIGN_CENTER);
@@ -122,20 +167,45 @@
     gtk_widget_set_valign(priv->label, GTK_ALIGN_START);
     gtk_label_set_line_wrap(GTK_LABEL(priv->label), TRUE);
     gtk_label_set_max_width_chars(GTK_LABEL(priv->label), 60);
+#if USE(GTK4)
+    gtk_widget_set_hexpand(priv->label, TRUE);
+    gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(priv->swindow), priv->label);
+#else
     gtk_container_add(GTK_CONTAINER(priv->swindow), priv->label);
     gtk_widget_show(priv->label);
+#endif
 
     GtkWidget* actionBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-    gtk_style_context_add_class(gtk_widget_get_style_context(actionBox), "dialog-action-box");
+    gtk_widget_add_css_class(actionBox, "dialog-action-box");
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(priv->vbox), actionBox);
+#else
     gtk_box_pack_end(GTK_BOX(priv->vbox), actionBox, FALSE, TRUE, 0);
     gtk_widget_show(actionBox);
+#endif
 
+#if USE(GTK4)
+    priv->actionArea = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+    gtk_box_set_homogeneous(GTK_BOX(priv->actionArea), TRUE);
+    gtk_widget_set_halign(priv->actionArea, GTK_ALIGN_FILL);
+#else
     priv->actionArea = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
     gtk_button_box_set_layout(GTK_BUTTON_BOX(priv->actionArea), GTK_BUTTONBOX_EXPAND);
+#endif
     gtk_widget_set_hexpand(priv->actionArea, TRUE);
-    gtk_style_context_add_class(gtk_widget_get_style_context(priv->actionArea), "dialog-action-area");
+    gtk_widget_add_css_class(priv->actionArea, "dialog-action-area");
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(actionBox), priv->actionArea);
+#else
     gtk_box_pack_end(GTK_BOX(actionBox), priv->actionArea, FALSE, TRUE, 0);
     gtk_widget_show(priv->actionArea);
+#endif
+
+#if USE(GTK4)
+    auto* controller = gtk_event_controller_key_new();
+    g_signal_connect_object(controller, "key-pressed", G_CALLBACK(webkitScriptDialogImplKeyPressed), dialog, G_CONNECT_SWAPPED);
+    gtk_widget_add_controller(GTK_WIDGET(dialog), controller);
+#endif
 }
 
 static void webkitScriptDialogImplDispose(GObject* object)
@@ -147,6 +217,10 @@
         dialog->priv->dialog = nullptr;
     }
 
+#if USE(GTK4)
+    webkitWebViewDialogSetChild(WEBKIT_WEB_VIEW_DIALOG(object), nullptr);
+#endif
+
     G_OBJECT_CLASS(webkit_script_dialog_impl_parent_class)->dispose(object);
 }
 
@@ -157,7 +231,9 @@
     objectClass->dispose = webkitScriptDialogImplDispose;
 
     GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(klass);
+#if !USE(GTK4)
     widgetClass->key_press_event = webkitScriptDialogImplKeyPressEvent;
+#endif
     widgetClass->map = webkitScriptDialogImplMap;
     gtk_widget_class_set_accessible_role(widgetClass, ATK_ROLE_ALERT);
 }
@@ -176,12 +252,18 @@
     WebKitScriptDialogImplPrivate* priv = dialog->priv;
     GtkWidget* button = gtk_button_new_with_label(text);
     gtk_button_set_use_underline(GTK_BUTTON(button), TRUE);
-    gtk_style_context_add_class(gtk_widget_get_style_context(button), "text-button");
+    gtk_widget_add_css_class(button, "text-button");
+#if !USE(GTK4)
     gtk_widget_set_can_default(button, TRUE);
+#endif
 
     gtk_widget_set_valign(button, GTK_ALIGN_BASELINE);
+#if USE(GTK4)
+    gtk_box_append(GTK_BOX(priv->actionArea), button);
+#else
     gtk_container_add(GTK_CONTAINER(priv->actionArea), button);
     gtk_widget_show(button);
+#endif
 
     return button;
 }
@@ -205,7 +287,12 @@
     case WEBKIT_SCRIPT_DIALOG_PROMPT:
         dialog->priv->entry = gtk_entry_new();
         gtk_entry_set_text(GTK_ENTRY(dialog->priv->entry), scriptDialog->defaultText.data());
+#if USE(GTK4)
+        gtk_box_insert_child_after(GTK_BOX(dialog->priv->vbox), dialog->priv->entry,
+            gtk_widget_get_parent(gtk_widget_get_parent(dialog->priv->swindow)));
+#else
         gtk_container_add(GTK_CONTAINER(dialog->priv->vbox), dialog->priv->entry);
+#endif
         gtk_entry_set_activates_default(GTK_ENTRY(dialog->priv->entry), TRUE);
         gtk_widget_show(dialog->priv->entry);
 
@@ -274,5 +361,3 @@
 
     gtk_entry_set_text(GTK_ENTRY(dialog->priv->entry), text.utf8().data());
 }
-
-#endif

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.h (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.h	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitScriptDialogImpl.h	2020-05-29 09:40:52 UTC (rev 262286)
@@ -19,8 +19,6 @@
 
 #pragma once
 
-#if !USE(GTK4)
-
 #include "WebKitScriptDialog.h"
 #include "WebKitWebViewDialog.h"
 #include <wtf/text/WTFString.h>
@@ -55,5 +53,3 @@
 void webkitScriptDialogImplSetEntryText(WebKitScriptDialogImpl*, const String&);
 
 G_END_DECLS
-
-#endif

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp	2020-05-29 09:40:52 UTC (rev 262286)
@@ -572,6 +572,9 @@
 {
     WebKitWebViewBasePrivate* priv = webViewBase->priv;
     priv->dialog = dialog;
+#if USE(GTK4)
+    g_object_add_weak_pointer(G_OBJECT(dialog), reinterpret_cast<void**>(&priv->dialog));
+#endif
     gtk_widget_set_parent(dialog, GTK_WIDGET(webViewBase));
     gtk_widget_show(dialog);
 
@@ -590,19 +593,14 @@
         priv->inspectorView = nullptr;
         priv->inspectorViewSize = 0;
     } else if (priv->dialog == widget) {
+        g_object_remove_weak_pointer(G_OBJECT(widget), reinterpret_cast<void**>(&priv->dialog));
         priv->dialog = nullptr;
-        if (gtk_widget_get_visible(GTK_WIDGET(webViewBase)))
-            gtk_widget_grab_focus(GTK_WIDGET(webViewBase));
     } else if (priv->keyBindingTranslator.widget() == widget)
         priv->keyBindingTranslator.invalidate();
     else
         RELEASE_ASSERT_NOT_REACHED();
 
-    gboolean wasVisible = gtk_widget_get_visible(widget);
     gtk_widget_unparent(widget);
-
-    if (wasVisible && gtk_widget_get_visible(GTK_WIDGET(webViewBase)))
-        gtk_widget_queue_resize(GTK_WIDGET(webViewBase));
 }
 #else
 static void webkitWebViewBaseContainerRemove(GtkContainer* container, GtkWidget* widget)
@@ -742,6 +740,9 @@
 
     ASSERT(drawingArea->isInAcceleratedCompositingMode());
     webViewBase->priv->acceleratedBackingStore->snapshot(snapshot);
+
+    if (webViewBase->priv->dialog)
+        gtk_widget_snapshot_child(widget, webViewBase->priv->dialog, snapshot);
 }
 #else
 static gboolean webkitWebViewBaseDraw(GtkWidget* widget, cairo_t* cr)

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.cpp (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.cpp	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.cpp	2020-05-29 09:40:52 UTC (rev 262286)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Igalia S.L.
+ * Copyright (C) 2018, 2020 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
@@ -20,16 +20,40 @@
 #include "config.h"
 #include "WebKitWebViewDialog.h"
 
-#if !USE(GTK4)
-
+#include <WebCore/FloatSize.h>
+#include <WebCore/GtkVersioning.h>
+#include <WebCore/RefPtrCairo.h>
 #include <wtf/glib/GRefPtr.h>
 #include <wtf/glib/WTFGType.h>
 
 struct _WebKitWebViewDialogPrivate {
+    GtkWidget* child;
+#if USE(GTK4)
+    GRefPtr<GtkCssProvider> cssProvider;
+#endif
 };
 
+#if USE(GTK4)
+WEBKIT_DEFINE_ABSTRACT_TYPE(WebKitWebViewDialog, webkit_web_view_dialog, GTK_TYPE_WIDGET)
+#else
 WEBKIT_DEFINE_ABSTRACT_TYPE(WebKitWebViewDialog, webkit_web_view_dialog, GTK_TYPE_EVENT_BOX)
+#endif
 
+#if USE(GTK4)
+static void webkitWebViewDialogSnapshot(GtkWidget* widget, GtkSnapshot* snapshot)
+{
+    WebCore::FloatSize widgetSize(gtk_widget_get_width(widget), gtk_widget_get_height(widget));
+    graphene_rect_t rect = GRAPHENE_RECT_INIT(0, 0, widgetSize.width(), widgetSize.height());
+    RefPtr<cairo_t> cr = adoptRef(gtk_snapshot_append_cairo(snapshot, &rect));
+    cairo_set_operator(cr.get(), CAIRO_OPERATOR_OVER);
+    cairo_set_source_rgba(cr.get(), 0, 0, 0, 0.5);
+    cairo_paint(cr.get());
+
+    WebKitWebViewDialogPrivate* priv = WEBKIT_WEB_VIEW_DIALOG(widget)->priv;
+    if (priv->child)
+        gtk_widget_snapshot_child(widget, priv->child, snapshot);
+}
+#else
 static gboolean webkitWebViewDialogDraw(GtkWidget* widget, cairo_t* cr)
 {
     cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
@@ -48,12 +72,24 @@
 
     return FALSE;
 }
+#endif
 
+#if USE(GTK4)
+static void webkitWebViewDialogSizeAllocate(GtkWidget* widget, int width, int height, int baseline)
+#else
 static void webkitWebViewDialogSizeAllocate(GtkWidget* widget, GtkAllocation* allocation)
+#endif
 {
+#if USE(GTK4)
+    GTK_WIDGET_CLASS(webkit_web_view_dialog_parent_class)->size_allocate(widget, width, height, baseline);
+    GtkAllocation allocationStack = { 0, 0, width, height };
+    GtkAllocation* allocation = &allocationStack;
+    GtkWidget* child = WEBKIT_WEB_VIEW_DIALOG(widget)->priv->child;
+#else
     GTK_WIDGET_CLASS(webkit_web_view_dialog_parent_class)->size_allocate(widget, allocation);
+    GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget));
+#endif
 
-    GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget));
     if (!child)
         return;
 
@@ -74,10 +110,21 @@
 {
     G_OBJECT_CLASS(webkit_web_view_dialog_parent_class)->constructed(object);
 
+#if USE(GTK4)
+    gtk_widget_add_css_class(GTK_WIDGET(object), "dialog");
+    gtk_widget_add_css_class(GTK_WIDGET(object), "message");
+    gtk_widget_add_css_class(GTK_WIDGET(object), GTK_STYLE_CLASS_CSD);
+    gtk_widget_remove_css_class(GTK_WIDGET(object), GTK_STYLE_CLASS_BACKGROUND);
+
+    WebKitWebViewDialogPrivate* priv = WEBKIT_WEB_VIEW_DIALOG(object)->priv;
+    priv->cssProvider = adoptGRef(gtk_css_provider_new());
+    gtk_css_provider_load_from_data(priv->cssProvider.get(), ".dialog-vbox { border-radius: 7px; }", -1);
+#else
     gtk_widget_set_app_paintable(GTK_WIDGET(object), TRUE);
 
     gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(object)), GTK_STYLE_CLASS_CSD);
     gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(object)), GTK_STYLE_CLASS_BACKGROUND);
+#endif
 }
 
 static void webkit_web_view_dialog_class_init(WebKitWebViewDialogClass* klass)
@@ -86,10 +133,35 @@
     objectClass->constructed = webkitWebViewDialogConstructed;
 
     GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(klass);
+#if USE(GTK4)
+    widgetClass->snapshot = webkitWebViewDialogSnapshot;
+#else
     widgetClass->draw = webkitWebViewDialogDraw;
+#endif
     widgetClass->size_allocate = webkitWebViewDialogSizeAllocate;
 
+#if USE(GTK4)
+    gtk_widget_class_set_css_name(widgetClass, "window");
+#else
     gtk_widget_class_set_css_name(widgetClass, "messagedialog");
+#endif
 }
 
+#if USE(GTK4)
+void webkitWebViewDialogSetChild(WebKitWebViewDialog* dialog, GtkWidget* child)
+{
+    WebKitWebViewDialogPrivate* priv = dialog->priv;
+    g_clear_pointer(&priv->child, gtk_widget_unparent);
+    if (child) {
+        gtk_widget_set_parent(child, GTK_WIDGET(dialog));
+        gtk_widget_add_css_class(child, GTK_STYLE_CLASS_BACKGROUND);
+        gtk_style_context_add_provider(gtk_widget_get_style_context(child), GTK_STYLE_PROVIDER(priv->cssProvider.get()), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+        priv->child = child;
+    }
+}
+
+GtkWidget* webkitWebViewDialogGetChild(WebKitWebViewDialog* dialog)
+{
+    return dialog->priv->child;
+}
 #endif

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.h (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.h	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewDialog.h	2020-05-29 09:40:52 UTC (rev 262286)
@@ -19,8 +19,6 @@
 
 #pragma once
 
-#if !USE(GTK4)
-
 #include <gtk/gtk.h>
 
 G_BEGIN_DECLS
@@ -37,17 +35,27 @@
 typedef struct _WebKitWebViewDialogPrivate WebKitWebViewDialogPrivate;
 
 struct _WebKitWebViewDialog {
+#if USE(GTK4)
+    GtkWidget parent;
+#else
     GtkEventBox parent;
+#endif
 
     WebKitWebViewDialogPrivate* priv;
 };
 
 struct _WebKitWebViewDialogClass {
+#if USE(GTK4)
+    GtkWidgetClass parentClass;
+#else
     GtkEventBoxClass parentClass;
+#endif
 };
 
 GType webkit_web_view_dialog_get_type();
+#if USE(GTK4)
+void webkitWebViewDialogSetChild(WebKitWebViewDialog*, GtkWidget*);
+GtkWidget* webkitWebViewDialogGetChild(WebKitWebViewDialog*);
+#endif
 
 G_END_DECLS
-
-#endif

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp (262285 => 262286)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp	2020-05-29 08:59:33 UTC (rev 262285)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp	2020-05-29 09:40:52 UTC (rev 262286)
@@ -43,12 +43,10 @@
 
 gboolean webkitWebViewScriptDialog(WebKitWebView* webView, WebKitScriptDialog* scriptDialog)
 {
-#if !USE(GTK4)
     GUniquePtr<char> title(g_strdup_printf("_javascript_ - %s", webkitWebViewGetPage(webView).pageLoadState().url().utf8().data()));
     // Limit script dialog size to 80% of the web view size.
     GtkRequisition maxSize = { static_cast<int>(gtk_widget_get_allocated_width(GTK_WIDGET(webView)) * 0.80), static_cast<int>(gtk_widget_get_allocated_height(GTK_WIDGET(webView)) * 0.80) };
     webkitWebViewBaseAddDialog(WEBKIT_WEB_VIEW_BASE(webView), webkitScriptDialogImplNew(scriptDialog, title.get(), &maxSize));
-#endif
 
     return TRUE;
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to