Title: [106559] trunk/Source
Revision
106559
Author
[email protected]
Date
2012-02-02 08:28:14 -0800 (Thu, 02 Feb 2012)

Log Message

[GTK] WebKitWebView won't work in a GtkOffscreenWindow
https://bugs.webkit.org/show_bug.cgi?id=76911

Patch by Claudio Saavedra  <[email protected]> and Martin Robinson <[email protected]> on 2012-02-02
Reviewed by Philippe Normand.

Source/WebCore:

* platform/gtk/GtkUtilities.cpp:
(WebCore::widgetIsOnscreenToplevelWindow): Added this helper.
* platform/gtk/GtkUtilities.h:
(WebCore): Added helper declaration.

Source/WebKit/gtk:

* WebCoreSupport/ChromeClientGtk.cpp:
(WebKit::ChromeClient::windowRect): Use the new widgetIsOnscreenToplevelWindow helper.
(WebKit::ChromeClient::setWindowRect): Ditto.
(WebKit::ChromeClient::unfocus): Ditto.
(WebKit::ChromeClient::runOpenPanel): Ditto.
* tests/testwebview.c: Added a test to ensure that loading a page in an offscreen window does not crash.
* webkit/webkitglobals.cpp:
(currentToplevelCallback):
* webkit/webkitwebframe.cpp:
(webkit_web_frame_print_full):
(webkit_web_frame_print):
* webkit/webkitwebview.cpp:
(webkit_web_view_focus_in_event):
(webkit_web_view_script_dialog):

Source/WebKit2:

* UIProcess/API/gtk/WebKitUIClient.cpp:
(getWindowFrame): Use the new helper.
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewCreateJavaScriptDialog): Ditto
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseRealize): Ditto.
(webkitWebViewBaseSizeAllocate): Ditto.
(webkitWebViewBaseFocusInEvent): Ditto.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (106558 => 106559)


--- trunk/Source/WebCore/ChangeLog	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebCore/ChangeLog	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,3 +1,15 @@
+2012-02-02  Claudio Saavedra  <[email protected]> and Martin Robinson  <[email protected]>
+
+        [GTK] WebKitWebView won't work in a GtkOffscreenWindow
+        https://bugs.webkit.org/show_bug.cgi?id=76911
+
+        Reviewed by Philippe Normand.
+
+        * platform/gtk/GtkUtilities.cpp:
+        (WebCore::widgetIsOnscreenToplevelWindow): Added this helper.
+        * platform/gtk/GtkUtilities.h:
+        (WebCore): Added helper declaration.
+
 2012-02-02  Allan Sandfeld Jensen  <[email protected]>
 
         Update active and hover state on touch release.

Modified: trunk/Source/WebCore/platform/gtk/GtkUtilities.cpp (106558 => 106559)


--- trunk/Source/WebCore/platform/gtk/GtkUtilities.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebCore/platform/gtk/GtkUtilities.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -42,4 +42,9 @@
     return IntPoint(windowOriginX + xInWindow, windowOriginY + yInWindow);
 }
 
+bool widgetIsOnscreenToplevelWindow(GtkWidget* widget)
+{
+    return gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget);
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/gtk/GtkUtilities.h (106558 => 106559)


--- trunk/Source/WebCore/platform/gtk/GtkUtilities.h	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebCore/platform/gtk/GtkUtilities.h	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011, Igalia S.L.
+ * Copyright (C) 2011, 2012 Igalia S.L.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -24,6 +24,7 @@
 class IntPoint;
 
 IntPoint convertWidgetPointToScreenPoint(GtkWidget*, const IntPoint&);
+bool widgetIsOnscreenToplevelWindow(GtkWidget*);
 
 } // namespace WebCore
 

Modified: trunk/Source/WebKit/gtk/ChangeLog (106558 => 106559)


--- trunk/Source/WebKit/gtk/ChangeLog	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/ChangeLog	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,3 +1,25 @@
+2012-02-02  Claudio Saavedra  <[email protected]> and Martin Robinson  <[email protected]>
+
+        [GTK] WebKitWebView won't work in a GtkOffscreenWindow
+        https://bugs.webkit.org/show_bug.cgi?id=76911
+
+        Reviewed by Philippe Normand.
+
+        * WebCoreSupport/ChromeClientGtk.cpp:
+        (WebKit::ChromeClient::windowRect): Use the new widgetIsOnscreenToplevelWindow helper.
+        (WebKit::ChromeClient::setWindowRect): Ditto.
+        (WebKit::ChromeClient::unfocus): Ditto.
+        (WebKit::ChromeClient::runOpenPanel): Ditto.
+        * tests/testwebview.c: Added a test to ensure that loading a page in an offscreen window does not crash.
+        * webkit/webkitglobals.cpp:
+        (currentToplevelCallback):
+        * webkit/webkitwebframe.cpp:
+        (webkit_web_frame_print_full):
+        (webkit_web_frame_print):
+        * webkit/webkitwebview.cpp:
+        (webkit_web_view_focus_in_event):
+        (webkit_web_view_script_dialog):
+
 2012-02-02  Mario Sanchez Prada  <[email protected]>
 
         [Gtk] atk_text_get_text_at_offset() sometimes fails to provide the correct line

Modified: trunk/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp (106558 => 106559)


--- trunk/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -5,6 +5,7 @@
  * Copyright (C) 2008 Alp Toker <[email protected]>
  * Copyright (C) 2008 Gustavo Noronha Silva <[email protected]>
  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (C) 2012 Igalia S. L.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -99,7 +100,7 @@
 FloatRect ChromeClient::windowRect()
 {
     GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
-    if (gtk_widget_is_toplevel(window)) {
+    if (widgetIsOnscreenToplevelWindow(window)) {
         gint left, top, width, height;
         gtk_window_get_position(GTK_WINDOW(window), &left, &top);
         gtk_window_get_size(GTK_WINDOW(window), &width, &height);
@@ -128,7 +129,7 @@
         return;
 
     GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
-    if (gtk_widget_is_toplevel(window)) {
+    if (widgetIsOnscreenToplevelWindow(window)) {
         gtk_window_move(GTK_WINDOW(window), intrect.x(), intrect.y());
         gtk_window_resize(GTK_WINDOW(window), intrect.width(), intrect.height());
     }
@@ -153,7 +154,7 @@
 void ChromeClient::unfocus()
 {
     GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
-    if (gtk_widget_is_toplevel(window))
+    if (widgetIsOnscreenToplevelWindow(window))
         gtk_window_set_focus(GTK_WINDOW(window), NULL);
 }
 
@@ -775,8 +776,12 @@
 {
     RefPtr<FileChooser> chooser = prpFileChooser;
 
+    GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
+    if (!widgetIsOnscreenToplevelWindow(toplevel))
+        toplevel = 0;
+
     GtkWidget* dialog = gtk_file_chooser_dialog_new(_("Upload File"),
-                                                    GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(m_webView))),
+                                                    toplevel ? GTK_WINDOW(toplevel) : 0,
                                                     GTK_FILE_CHOOSER_ACTION_OPEN,
                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,

Modified: trunk/Source/WebKit/gtk/tests/testwebview.c (106558 => 106559)


--- trunk/Source/WebKit/gtk/tests/testwebview.c	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/tests/testwebview.c	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2008 Holger Hans Peter Freyther
  * Copyright (C) 2009, 2010 Collabora Ltd.
+ * Copyright (C) 2012 Igalia S.L.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -363,6 +364,24 @@
     gtk_widget_destroy(window);
 }    
 
+static void test_webkit_web_view_in_offscreen_window_does_not_crash()
+{
+    loop = g_main_loop_new(NULL, TRUE);
+
+    GtkWidget *window = gtk_offscreen_window_new();
+    GtkWidget *web_view = webkit_web_view_new();
+
+    gtk_container_add(GTK_CONTAINER(window), web_view);
+    gtk_widget_show_all(window);
+    g_signal_connect(web_view, "notify::load-status", G_CALLBACK(idle_quit_loop_cb), NULL);
+    webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), base_uri);
+
+    g_main_loop_run(loop);
+
+    gtk_widget_destroy(window);
+    g_main_loop_unref(loop);
+}
+
 int main(int argc, char** argv)
 {
     SoupServer* server;
@@ -390,6 +409,7 @@
     g_test_add_func("/webkit/webview/destroy", test_webkit_web_view_destroy);
     g_test_add_func("/webkit/webview/grab_focus", test_webkit_web_view_grab_focus);
     g_test_add_func("/webkit/webview/window-features", test_webkit_web_view_window_features);
+    g_test_add_func("/webkit/webview/webview-in-offscreen-window-does-not-crash", test_webkit_web_view_in_offscreen_window_does_not_crash);
 
     return g_test_run ();
 }

Modified: trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp (106558 => 106559)


--- trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/webkit/webkitglobals.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -24,6 +24,7 @@
 #include "ApplicationCacheStorage.h"
 #include "Chrome.h"
 #include "FrameNetworkingContextGtk.h"
+#include "GtkUtilities.h"
 #include "GOwnPtr.h"
 #include "GRefPtr.h"
 #include "IconDatabase.h"
@@ -225,10 +226,7 @@
         return NULL;
 
     GtkWidget* toplevel =  gtk_widget_get_toplevel(GTK_WIDGET(context->coreFrame()->page()->chrome()->platformPageClient()));
-    if (gtk_widget_is_toplevel(toplevel))
-        return toplevel;
-    else
-        return NULL;
+    return widgetIsOnscreenToplevelWindow(toplevel) ? toplevel : 0;
 }
 
 /**

Modified: trunk/Source/WebKit/gtk/webkit/webkitwebframe.cpp (106558 => 106559)


--- trunk/Source/WebKit/gtk/webkit/webkitwebframe.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/webkit/webkitwebframe.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -40,6 +40,7 @@
 #include "FrameView.h"
 #include "GCController.h"
 #include "GraphicsContext.h"
+#include "GtkUtilities.h"
 #include "GtkVersioning.h"
 #include "HTMLFrameOwnerElement.h"
 #include "JSDOMBinding.h"
@@ -940,8 +941,7 @@
     g_return_val_if_fail(GTK_IS_PRINT_OPERATION(operation), GTK_PRINT_OPERATION_RESULT_ERROR);
 
     GtkWidget* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(webkit_web_frame_get_web_view(frame)));
-
-    if (!gtk_widget_is_toplevel(topLevel))
+    if (!widgetIsOnscreenToplevelWindow(topLevel))
         topLevel = 0;
 
     Frame* coreFrame = core(frame);
@@ -980,7 +980,7 @@
 
     if (error) {
         GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(priv->webView));
-        GtkWidget* dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(window) ? GTK_WINDOW(window) : 0,
+        GtkWidget* dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(window) ? GTK_WINDOW(window) : 0,
                                                    GTK_DIALOG_DESTROY_WITH_PARENT,
                                                    GTK_MESSAGE_ERROR,
                                                    GTK_BUTTONS_CLOSE,

Modified: trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp (106558 => 106559)


--- trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -904,7 +904,7 @@
     // TODO: Improve focus handling as suggested in
     // http://bugs.webkit.org/show_bug.cgi?id=16910
     GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
-    if (gtk_widget_is_toplevel(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
+    if (widgetIsOnscreenToplevelWindow(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
         WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
         FocusController* focusController = core(webView)->focusController();
 
@@ -1106,7 +1106,12 @@
     }
 
     window = gtk_widget_get_toplevel(GTK_WIDGET(webView));
-    dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(window) ? GTK_WINDOW(window) : 0, GTK_DIALOG_DESTROY_WITH_PARENT, messageType, buttons, "%s", message);
+    dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(window) ? GTK_WINDOW(window) : 0,
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    messageType,
+                                    buttons,
+                                    "%s",
+                                    message);
     gchar* title = g_strconcat("_javascript_ - ", webkit_web_frame_get_uri(frame), NULL);
     gtk_window_set_title(GTK_WINDOW(dialog), title);
     g_free(title);

Modified: trunk/Source/WebKit2/ChangeLog (106558 => 106559)


--- trunk/Source/WebKit2/ChangeLog	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit2/ChangeLog	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,3 +1,19 @@
+2012-02-02  Claudio Saavedra  <[email protected]> and Martin Robinson  <[email protected]>
+
+        [GTK] WebKitWebView won't work in a GtkOffscreenWindow
+        https://bugs.webkit.org/show_bug.cgi?id=76911
+
+        Reviewed by Philippe Normand.
+
+        * UIProcess/API/gtk/WebKitUIClient.cpp:
+        (getWindowFrame): Use the new helper.
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewCreateJavaScriptDialog): Ditto
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseRealize): Ditto.
+        (webkitWebViewBaseSizeAllocate): Ditto.
+        (webkitWebViewBaseFocusInEvent): Ditto.
+
 2012-02-01  Philippe Normand  <[email protected]>
 
         [GStreamer] FFTFrame implementation

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp (106558 => 106559)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Igalia S.L.
+ * Copyright (C) 2011, 2012 Igalia S.L.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -25,6 +25,7 @@
 #include "WebKitWebViewPrivate.h"
 #include "WebKitWindowPropertiesPrivate.h"
 #include "WebPageProxy.h"
+#include <WebCore/GtkUtilities.h>
 
 using namespace WebKit;
 
@@ -111,7 +112,7 @@
 {
     GdkRectangle geometry = { 0, 0, 0, 0 };
     GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(clientInfo));
-    if (gtk_widget_is_toplevel(window) && gtk_widget_get_visible(window)) {
+    if (WebCore::widgetIsOnscreenToplevelWindow(window) && gtk_widget_get_visible(window)) {
         gtk_window_get_position(GTK_WINDOW(window), &geometry.x, &geometry.y);
         gtk_window_get_size(GTK_WINDOW(window), &geometry.width, &geometry.height);
     }

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (106558 => 106559)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -36,6 +36,7 @@
 #include "WebKitPrivate.h"
 #include "WebPageProxy.h"
 #include <WebCore/DragIcon.h>
+#include <WebCore/GtkUtilities.h>
 #include <glib/gi18n-lib.h>
 #include <wtf/gobject/GOwnPtr.h>
 #include <wtf/gobject/GRefPtr.h>
@@ -109,7 +110,7 @@
 static GtkWidget* webkitWebViewCreateJavaScriptDialog(WebKitWebView* webView, GtkMessageType type, GtkButtonsType buttons, int defaultResponse, const char* message)
 {
     GtkWidget* parent = gtk_widget_get_toplevel(GTK_WIDGET(webView));
-    GtkWidget* dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(parent) ? GTK_WINDOW(parent) : 0,
+    GtkWidget* dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(parent) ? GTK_WINDOW(parent) : 0,
                                                GTK_DIALOG_DESTROY_WITH_PARENT, type, buttons, "%s", message);
     GOwnPtr<char> title(g_strdup_printf("_javascript_ - %s", webkit_web_view_get_uri(webView)));
     gtk_window_set_title(GTK_WINDOW(dialog), title.get());

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (106558 => 106559)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp	2012-02-02 15:53:23 UTC (rev 106558)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp	2012-02-02 16:28:14 UTC (rev 106559)
@@ -142,7 +142,7 @@
     gtk_im_context_set_client_window(priv->imContext.get(), window);
 
     GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
-    if (gtk_widget_is_toplevel(toplevel) && GTK_IS_WINDOW(toplevel)) {
+    if (widgetIsOnscreenToplevelWindow(toplevel)) {
         webkitWebViewBaseNotifyResizerSizeForWindow(webView, GTK_WINDOW(toplevel));
         g_signal_connect(toplevel, "notify::resize-grip-visible",
                          G_CALLBACK(toplevelWindowResizeGripVisibilityChanged), webView);
@@ -214,7 +214,7 @@
     priv->pageProxy->drawingArea()->setSize(IntSize(allocation->width, allocation->height), IntSize());
 
     GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
-    if (gtk_widget_is_toplevel(toplevel) && GTK_IS_WINDOW(toplevel))
+    if (widgetIsOnscreenToplevelWindow(toplevel))
         webkitWebViewBaseNotifyResizerSizeForWindow(webViewBase, GTK_WINDOW(toplevel));
 }
 
@@ -224,7 +224,7 @@
     WebKitWebViewBasePrivate* priv = webViewBase->priv;
 
     GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
-    if (gtk_widget_is_toplevel(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
+    if (widgetIsOnscreenToplevelWindow(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
         gtk_im_context_focus_in(priv->imContext.get());
         if (!priv->isPageActive) {
             priv->isPageActive = TRUE;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to