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;