Diff
Modified: releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testcopyandpaste.c (109706 => 109707)
--- releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testcopyandpaste.c 2012-03-05 06:57:40 UTC (rev 109706)
+++ releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testcopyandpaste.c 2012-03-05 07:50:20 UTC (rev 109707)
@@ -126,6 +126,7 @@
gtk_widget_show(fixture->window);
gtk_widget_show(GTK_WIDGET(fixture->webView));
gtk_window_present(GTK_WINDOW(fixture->window));
+ gtk_widget_grab_focus(fixture->webView);
g_signal_connect(fixture->webView, "notify::load-status",
G_CALLBACK(load_status_cb), fixture);
Modified: releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testkeyevents.c (109706 => 109707)
--- releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testkeyevents.c 2012-03-05 06:57:40 UTC (rev 109706)
+++ releases/WebKitGTK/webkit-1.8/Source/WebKit/gtk/tests/testkeyevents.c 2012-03-05 07:50:20 UTC (rev 109707)
@@ -118,7 +118,6 @@
gboolean map_event_cb(GtkWidget *widget, GdkEvent* event, gpointer data)
{
- gtk_widget_grab_focus(widget);
KeyEventFixture* fixture = (KeyEventFixture*)data;
webkit_web_view_load_string(fixture->webView, fixture->info->page,
"text/html", "utf-8", "file://");
@@ -134,6 +133,7 @@
gtk_widget_show(fixture->window);
gtk_widget_show(GTK_WIDGET(fixture->webView));
gtk_window_present(GTK_WINDOW(fixture->window));
+ gtk_widget_grab_focus(fixture->webView);
g_signal_connect(fixture->webView, "notify::load-status",
load_event_callback, fixture);
Modified: releases/WebKitGTK/webkit-1.8/Source/WebKit2/ChangeLog (109706 => 109707)
--- releases/WebKitGTK/webkit-1.8/Source/WebKit2/ChangeLog 2012-03-05 06:57:40 UTC (rev 109706)
+++ releases/WebKitGTK/webkit-1.8/Source/WebKit2/ChangeLog 2012-03-05 07:50:20 UTC (rev 109707)
@@ -1,3 +1,23 @@
+2012-03-04 Sergio Villar Senin <[email protected]>
+
+ [WK2][GTK] WebProcess SIGSEVs due to incorrect clipboard handling
+ https://bugs.webkit.org/show_bug.cgi?id=79252
+
+ Do not execute clipboard callbacks after the Frame associated with
+ it is destroyed.
+
+ This change is already covered by the TestWebViewEditor unit tests
+ (among others), they hang (because WebProcess dies) without this
+ patch in Debug builds.
+
+ * WebProcess/WebCoreSupport/gtk/WebEditorClientGtk.cpp:
+ (EditorClientFrameDestructionObserver):
+ (WebKit::EditorClientFrameDestructionObserver::EditorClientFrameDestructionObserver):
+ (WebKit::EditorClientFrameDestructionObserver::frameDestroyed):
+ (WebKit::EditorClientFrameDestructionObserver::destroyOnClosureFinalization):
+ (WebKit):
+ (WebKit::WebEditorClient::setSelectionPrimaryClipboardIfNeeded):
+
2012-03-02 Carlos Garcia Campos <[email protected]>
[GTK] Invalid check in webkit_web_view_set_zoom_level() when zoom-text-only is enabled
Modified: releases/WebKitGTK/webkit-1.8/Source/WebKit2/WebProcess/WebCoreSupport/gtk/WebEditorClientGtk.cpp (109706 => 109707)
--- releases/WebKitGTK/webkit-1.8/Source/WebKit2/WebProcess/WebCoreSupport/gtk/WebEditorClientGtk.cpp 2012-03-05 06:57:40 UTC (rev 109706)
+++ releases/WebKitGTK/webkit-1.8/Source/WebKit2/WebProcess/WebCoreSupport/gtk/WebEditorClientGtk.cpp 2012-03-05 07:50:20 UTC (rev 109707)
@@ -21,6 +21,7 @@
#include "WebEditorClient.h"
#include "Frame.h"
+#include "FrameDestructionObserver.h"
#include "PlatformKeyboardEvent.h"
#include "WebPage.h"
#include "WebPageProxyMessages.h"
@@ -130,7 +131,28 @@
}
#if PLATFORM(X11)
+class EditorClientFrameDestructionObserver : FrameDestructionObserver {
+public:
+ EditorClientFrameDestructionObserver(Frame* frame, GClosure* closure)
+ : FrameDestructionObserver(frame)
+ , m_closure(closure)
+ {
+ g_closure_add_finalize_notifier(m_closure, this, destroyOnClosureFinalization);
+ }
+
+ void frameDestroyed()
+ {
+ g_closure_invalidate(m_closure);
+ FrameDestructionObserver::frameDestroyed();
+ }
+private:
+ GClosure* m_closure;
+
+ static void destroyOnClosureFinalization(gpointer data, GClosure* closure) { delete data; }
+};
+
static Frame* frameSettingClipboard;
+
static void collapseSelection(GtkClipboard* clipboard, Frame* frame)
{
if (frameSettingClipboard && frameSettingClipboard == frame)
@@ -156,6 +178,10 @@
frameSettingClipboard = frame;
GClosure* callback = g_cclosure_new(G_CALLBACK(collapseSelection), frame, 0);
+ // This observer will be self-destroyed on closure finalization,
+ // that will happen either after closure execution or after
+ // closure invalidation.
+ new EditorClientFrameDestructionObserver(frame, callback);
g_closure_set_marshal(callback, g_cclosure_marshal_VOID__VOID);
PasteboardHelper::defaultPasteboardHelper()->writeClipboardContents(clipboard, PasteboardHelper::DoNotIncludeSmartPaste, callback);
frameSettingClipboard = 0;