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;
}