WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
wd-gtk4.diff (text/plain), 14.85 KB, created by
Carlos Garcia Campos
on 2020-05-29 06:08:16 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2020-05-29 06:08:16 PDT
Size:
14.85 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 63d5f571a405..d0da1021c249 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2020-05-29 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK4] Make WebDriver work >+ https://bugs.webkit.org/show_bug.cgi?id=212316 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add helper gtk definitions to avoid ifdefs and implement currentScreenMonitor() for GTK4. >+ >+ * platform/gtk/GtkVersioning.h: >+ (gtk_window_move): >+ (gtk_window_minimize): >+ (gtk_window_unminimize): >+ * platform/gtk/PlatformScreenGtk.cpp: >+ (WebCore::currentScreenMonitor): >+ (WebCore::screenRect): >+ (WebCore::screenAvailableRect): >+ (WebCore::getCurrentScreenMonitor): Deleted. >+ > 2020-05-27 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK4] Implement script dialogs >diff --git a/Source/WebCore/platform/gtk/GtkVersioning.h b/Source/WebCore/platform/gtk/GtkVersioning.h >index 2bf17061c827..dfc2f39f3504 100644 >--- a/Source/WebCore/platform/gtk/GtkVersioning.h >+++ b/Source/WebCore/platform/gtk/GtkVersioning.h >@@ -57,6 +57,11 @@ gtk_window_get_position(GtkWindow*, int* x, int* y) > *x = *y = 0; > } > >+static inline void >+gtk_window_move(GtkWindow*, int, int) >+{ >+} >+ > static inline void > gtk_init(int*, char***) > { >@@ -191,4 +196,16 @@ gtk_widget_add_css_class(GtkWidget* widget, const char* name) > gtk_style_context_add_class(gtk_widget_get_style_context(widget), name); > } > >+static inline void >+gtk_window_minimize(GtkWindow* window) >+{ >+ gtk_window_iconify(window); >+} >+ >+static inline void >+gtk_window_unminimize(GtkWindow* window) >+{ >+ gtk_window_deiconify(window); >+} >+ > #endif // USE(GTK4) >diff --git a/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp b/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp >index 052cc4c5a857..23f199b42576 100644 >--- a/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp >+++ b/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp >@@ -168,15 +168,15 @@ void setScreenDPIObserverHandler(Function<void()>&& handler, void* context) > } > } > >-GdkMonitor* getCurrentScreenMonitor() >+static GRefPtr<GdkMonitor> currentScreenMonitor() > { >-#if USE(GTK4) >- return nullptr; >-#else > GdkDisplay* display = gdk_display_get_default(); > if (!display) > return nullptr; > >+#if USE(GTK4) >+ return adoptGRef(static_cast<GdkMonitor*>(g_list_model_get_item(gdk_display_get_monitors(display), 0))); >+#else > auto* rootWindow = gdk_get_default_root_window(); > if (!rootWindow) > return nullptr; >@@ -190,24 +190,23 @@ FloatRect screenRect(Widget*) > { > GdkRectangle geometry; > >- auto* monitor = getCurrentScreenMonitor(); >+ auto monitor = currentScreenMonitor(); > if (!monitor) > return { }; > >- gdk_monitor_get_geometry(monitor, &geometry); >+ gdk_monitor_get_geometry(monitor.get(), &geometry); > > return FloatRect(geometry.x, geometry.y, geometry.width, geometry.height); > } > > FloatRect screenAvailableRect(Widget*) > { >- GdkRectangle workArea; >- >- auto* monitor = getCurrentScreenMonitor(); >+ auto monitor = currentScreenMonitor(); > if (!monitor) > return { }; > >- gdk_monitor_get_workarea(monitor, &workArea); >+ GdkRectangle workArea; >+ gdk_monitor_get_workarea(monitor.get(), &workArea); > > return FloatRect(workArea.x, workArea.y, workArea.width, workArea.height); > } >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 09bec8ccdd11..d7eeaa283c4c 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,21 @@ >+2020-05-29 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK4] Make WebDriver work >+ https://bugs.webkit.org/show_bug.cgi?id=212316 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Fix UIClient::setWindowFrame to wait for surface size-changed signal after resizing the window and implement >+ maximize, minimize and restore windows for GTK4. >+ >+ * UIProcess/API/glib/WebKitUIClient.cpp: >+ * UIProcess/API/gtk/WebKitWebViewGtk.cpp: >+ (surfaceStateChangedCallback): >+ (webkitWebViewMonitorWindowState): >+ (webkitWebViewMaximizeWindow): >+ (webkitWebViewMinimizeWindow): >+ (webkitWebViewRestoreWindow): >+ > 2020-05-27 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK4] Implement HTTP auth dialog >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >index 07da96138db1..373171b68f7d 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp >@@ -200,8 +200,13 @@ private: > if (!needsMove && !needsResize) > return; > >- // There is no GtkWidget::configure-event in GTK4, move is not supported. >-#if !USE(GTK4) >+#if USE(GTK4) >+ auto* surface = gtk_native_get_surface(GTK_NATIVE(window)); >+ auto signalID = g_signal_connect(surface, "size-changed", G_CALLBACK(+[](GdkSurface*, int width, int height, GdkRectangle* targetGeometry) { >+ if (width == targetGeometry->width && height == targetGeometry->height) >+ RunLoop::current().stop(); >+ }), &geometry); >+#else > auto signalID = g_signal_connect(window, "configure-event", G_CALLBACK(windowConfigureEventCallback), &geometry); > if (needsMove) > gtk_window_move(GTK_WINDOW(window), geometry.x, geometry.y); >@@ -216,7 +221,9 @@ private: > timer->startOneShot(200_ms); > RunLoop::run(); > timer = nullptr; >-#if !USE(GTK4) >+#if USE(GTK4) >+ g_signal_handler_disconnect(surface, signalID); >+#else > g_signal_handler_disconnect(window, signalID); > #endif > } else >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >index 4601bab8f194..e13704654660 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -2461,7 +2461,9 @@ void webkitWebViewBaseSynthesizeKeyEvent(WebKitWebViewBase* webViewBase, KeyEven > auto keycode = widgetKeyvalToKeycode(GTK_WIDGET(webViewBase), keyval); > if (modifiers && shouldTranslate == ShouldTranslateKeyboardState::Yes) { > auto* display = gtk_widget_get_display(GTK_WIDGET(webViewBase)); >-#if !USE(GTK4) >+#if USE(GTK4) >+ gdk_display_translate_key(display, keycode, static_cast<GdkModifierType>(modifiers), 0, &keyval, nullptr, nullptr, nullptr); >+#else > gdk_keymap_translate_keyboard_state(gdk_keymap_get_for_display(display), keycode, static_cast<GdkModifierType>(modifiers), 0, &keyval, nullptr, nullptr, nullptr); > #endif > } >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp >index d4a55c555bea..91c7e6bb4479 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewGtk.cpp >@@ -26,6 +26,7 @@ > #include "WebKitWebViewPrivate.h" > #include <WebCore/Color.h> > #include <WebCore/GtkUtilities.h> >+#include <WebCore/GtkVersioning.h> > #include <WebCore/PlatformDisplay.h> > #include <WebCore/PlatformScreen.h> > #include <glib/gi18n-lib.h> >@@ -96,8 +97,9 @@ gboolean webkitWebViewRunFileChooser(WebKitWebView* webView, WebKitFileChooserRe > return TRUE; > } > >-#if !USE(GTK4) > struct WindowStateEvent { >+ WTF_MAKE_STRUCT_FAST_ALLOCATED; >+ > enum class Type { Maximize, Minimize, Restore }; > > WindowStateEvent(Type type, CompletionHandler<void()>&& completionHandler) >@@ -127,6 +129,38 @@ struct WindowStateEvent { > > static const char* gWindowStateEventID = "wk-window-state-event"; > >+#if USE(GTK4) >+static void surfaceStateChangedCallback(GdkSurface* surface, GParamSpec*, WebKitWebView* view) >+{ >+ auto* state = static_cast<WindowStateEvent*>(g_object_get_data(G_OBJECT(view), gWindowStateEventID)); >+ if (!state) { >+ g_signal_handlers_disconnect_by_func(surface, reinterpret_cast<gpointer>(surfaceStateChangedCallback), view); >+ return; >+ } >+ >+ auto surfaceState = gdk_toplevel_get_state(GDK_TOPLEVEL(surface)); >+ bool eventCompleted = false; >+ switch (state->type) { >+ case WindowStateEvent::Type::Maximize: >+ if (surfaceState & GDK_SURFACE_STATE_MAXIMIZED) >+ eventCompleted = true; >+ break; >+ case WindowStateEvent::Type::Minimize: >+ if ((surfaceState & GDK_SURFACE_STATE_MINIMIZED) || !gdk_surface_get_mapped(surface)) >+ eventCompleted = true; >+ break; >+ case WindowStateEvent::Type::Restore: >+ if (!(surfaceState & GDK_SURFACE_STATE_MAXIMIZED) && !(surfaceState & GDK_SURFACE_STATE_MINIMIZED)) >+ eventCompleted = true; >+ break; >+ } >+ >+ if (eventCompleted) { >+ g_signal_handlers_disconnect_by_func(surface, reinterpret_cast<gpointer>(surfaceStateChangedCallback), view); >+ g_object_set_data(G_OBJECT(view), gWindowStateEventID, nullptr); >+ } >+} >+#else > static gboolean windowStateEventCallback(GtkWidget* window, GdkEventWindowState* event, WebKitWebView* view) > { > auto* state = static_cast<WindowStateEvent*>(g_object_get_data(G_OBJECT(view), gWindowStateEventID)); >@@ -160,9 +194,22 @@ static gboolean windowStateEventCallback(GtkWidget* window, GdkEventWindowState* > } > #endif > >+static void >+webkitWebViewMonitorWindowState(WebKitWebView* view, GtkWindow* window, WindowStateEvent::Type type, CompletionHandler<void()>&& completionHandler) >+{ >+ g_object_set_data_full(G_OBJECT(view), gWindowStateEventID, new WindowStateEvent(type, WTFMove(completionHandler)), [](gpointer userData) { >+ delete static_cast<WindowStateEvent*>(userData); >+ }); >+ >+#if USE(GTK4) >+ g_signal_connect_object(gtk_native_get_surface(GTK_NATIVE(window)), "notify::state", G_CALLBACK(surfaceStateChangedCallback), view, G_CONNECT_AFTER); >+#else >+ g_signal_connect_object(window, "window-state-event", G_CALLBACK(windowStateEventCallback), view, G_CONNECT_AFTER); >+#endif >+} >+ > void webkitWebViewMaximizeWindow(WebKitWebView* view, CompletionHandler<void()>&& completionHandler) > { >-#if !USE(GTK4) > auto* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(view)); > if (!gtk_widget_is_toplevel(topLevel)) { > completionHandler(); >@@ -175,11 +222,9 @@ void webkitWebViewMaximizeWindow(WebKitWebView* view, CompletionHandler<void()>& > return; > } > >- g_object_set_data_full(G_OBJECT(view), gWindowStateEventID, new WindowStateEvent(WindowStateEvent::Type::Maximize, WTFMove(completionHandler)), [](gpointer userData) { >- delete static_cast<WindowStateEvent*>(userData); >- }); >- g_signal_connect_object(window, "window-state-event", G_CALLBACK(windowStateEventCallback), view, G_CONNECT_AFTER); >+ webkitWebViewMonitorWindowState(view, window, WindowStateEvent::Type::Maximize, WTFMove(completionHandler)); > gtk_window_maximize(window); >+ > #if ENABLE(DEVELOPER_MODE) > // Xvfb doesn't support maximize, so we resize the window to the screen size. > if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) { >@@ -192,12 +237,10 @@ void webkitWebViewMaximizeWindow(WebKitWebView* view, CompletionHandler<void()>& > } > #endif > gtk_widget_show(topLevel); >-#endif > } > > void webkitWebViewMinimizeWindow(WebKitWebView* view, CompletionHandler<void()>&& completionHandler) > { >-#if !USE(GTK4) > auto* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(view)); > if (!gtk_widget_is_toplevel(topLevel)) { > completionHandler(); >@@ -205,18 +248,13 @@ void webkitWebViewMinimizeWindow(WebKitWebView* view, CompletionHandler<void()>& > } > > auto* window = GTK_WINDOW(topLevel); >- g_object_set_data_full(G_OBJECT(view), gWindowStateEventID, new WindowStateEvent(WindowStateEvent::Type::Minimize, WTFMove(completionHandler)), [](gpointer userData) { >- delete static_cast<WindowStateEvent*>(userData); >- }); >- g_signal_connect_object(window, "window-state-event", G_CALLBACK(windowStateEventCallback), view, G_CONNECT_AFTER); >- gtk_window_iconify(window); >+ webkitWebViewMonitorWindowState(view, window, WindowStateEvent::Type::Minimize, WTFMove(completionHandler)); >+ gtk_window_minimize(window); > gtk_widget_hide(topLevel); >-#endif > } > > void webkitWebViewRestoreWindow(WebKitWebView* view, CompletionHandler<void()>&& completionHandler) > { >-#if !USE(GTK4) > auto* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(view)); > if (!gtk_widget_is_toplevel(topLevel)) { > completionHandler(); >@@ -229,14 +267,12 @@ void webkitWebViewRestoreWindow(WebKitWebView* view, CompletionHandler<void()>&& > return; > } > >- g_object_set_data_full(G_OBJECT(view), gWindowStateEventID, new WindowStateEvent(WindowStateEvent::Type::Restore, WTFMove(completionHandler)), [](gpointer userData) { >- delete static_cast<WindowStateEvent*>(userData); >- }); >- g_signal_connect_object(window, "window-state-event", G_CALLBACK(windowStateEventCallback), view, G_CONNECT_AFTER); >+ webkitWebViewMonitorWindowState(view, window, WindowStateEvent::Type::Restore, WTFMove(completionHandler)); > if (gtk_window_is_maximized(window)) > gtk_window_unmaximize(window); > if (!gtk_widget_get_mapped(topLevel)) >- gtk_window_deiconify(window); >+ gtk_window_unminimize(window); >+ > #if ENABLE(DEVELOPER_MODE) > // Xvfb doesn't support maximize, so we resize the window to the default size. > if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) { >@@ -249,7 +285,6 @@ void webkitWebViewRestoreWindow(WebKitWebView* view, CompletionHandler<void()>&& > } > #endif > gtk_widget_show(topLevel); >-#endif > } > > /** >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index d70b2aab68fd..40f2dab9b0e6 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2020-05-29 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK4] Make WebDriver work >+ https://bugs.webkit.org/show_bug.cgi?id=212316 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Stop connecting to WebKitWebView::close signal twice for newaly created windows. >+ >+ * MiniBrowser/gtk/BrowserWindow.c: >+ (webViewCreate): >+ > 2020-05-28 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK] WebDriver: stop using GdkEvent API in preparation for GTK4 >diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.c b/Tools/MiniBrowser/gtk/BrowserWindow.c >index 1de214cd463a..38d7a4519d31 100644 >--- a/Tools/MiniBrowser/gtk/BrowserWindow.c >+++ b/Tools/MiniBrowser/gtk/BrowserWindow.c >@@ -374,7 +374,6 @@ static GtkWidget *webViewCreate(WebKitWebView *webView, WebKitNavigationAction * > gtk_widget_grab_focus(GTK_WIDGET(newWebView)); > g_signal_connect(newWebView, "ready-to-show", G_CALLBACK(webViewReadyToShow), newWindow); > g_signal_connect(newWebView, "run-as-modal", G_CALLBACK(webViewRunAsModal), newWindow); >- g_signal_connect(newWebView, "close", G_CALLBACK(webViewClose), newWindow); > return GTK_WIDGET(newWebView); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
aperez
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 212316
: 400576