summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:56:46 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:57:30 +0200
commitb297e0fa5c217c9467033b7c8b46891a52870120 (patch)
tree43fc14689295e9e64f2719d05aad94e3049f6cd7 /Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
parent69d517dbfa69903d8593cc1737f0474b21e3251e (diff)
downloadqtwebkit-b297e0fa5c217c9467033b7c8b46891a52870120.tar.gz
Revert "Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)"
This reverts commit 5466563f4b5b6b86523e3f89bb7f77e5b5270c78. Caused OOM issues on some CI machines :(
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp50
1 files changed, 37 insertions, 13 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
index e5bac671e..b42b2ee8f 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
@@ -75,10 +75,6 @@ using namespace WebCore;
typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap;
-#if USE(TEXTURE_MAPPER_GL)
-void redirectedWindowDamagedCallback(void* data);
-#endif
-
struct _WebKitWebViewBasePrivate {
WebKitWebViewChildrenMap children;
OwnPtr<PageClientImpl> pageClient;
@@ -115,6 +111,7 @@ struct _WebKitWebViewBasePrivate {
#if USE(TEXTURE_MAPPER_GL)
OwnPtr<RedirectedXCompositeWindow> redirectedWindow;
+ bool readyToRenderAcceleratedCompositingResults;
#endif
};
@@ -303,7 +300,7 @@ static void webkitWebViewBaseContainerForall(GtkContainer* container, gboolean i
WebKitWebViewChildrenMap children = priv->children;
WebKitWebViewChildrenMap::const_iterator end = children.end();
for (WebKitWebViewChildrenMap::const_iterator current = children.begin(); current != end; ++current)
- (*callback)(current->key, callbackData);
+ (*callback)(current->first, callbackData);
if (includeInternals && priv->inspectorView)
(*callback)(priv->inspectorView, callbackData);
@@ -354,8 +351,7 @@ static void webkit_web_view_base_init(WebKitWebViewBase* webkitWebViewBase)
#if USE(TEXTURE_MAPPER_GL)
priv->redirectedWindow = RedirectedXCompositeWindow::create(IntSize(1, 1));
- if (priv->redirectedWindow)
- priv->redirectedWindow->setDamageNotifyCallback(redirectedWindowDamagedCallback, webkitWebViewBase);
+ priv->readyToRenderAcceleratedCompositingResults = false;
#endif
}
@@ -368,9 +364,10 @@ static bool webkitWebViewRenderAcceleratedCompositingResults(WebKitWebViewBase*
// To avoid flashes when initializing accelerated compositing for the first
// time, we wait until we know there's a frame ready before rendering.
WebKitWebViewBasePrivate* priv = webViewBase->priv;
- if (!priv->redirectedWindow)
+ if (!priv->readyToRenderAcceleratedCompositingResults)
return false;
+ ASSERT(priv->redirectedWindow);
cairo_rectangle(cr, clipRect->x, clipRect->y, clipRect->width, clipRect->height);
cairo_surface_t* surface = priv->redirectedWindow->cairoSurfaceForWidget(GTK_WIDGET(webViewBase));
cairo_set_source_surface(cr, surface, 0, 0);
@@ -433,7 +430,7 @@ static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase
}
#if USE(TEXTURE_MAPPER_GL)
- if (sizeChanged && webViewBase->priv->redirectedWindow)
+ if (sizeChanged)
webViewBase->priv->redirectedWindow->resize(viewRect.size());
#endif
@@ -804,8 +801,7 @@ void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebCon
#endif
#if USE(TEXTURE_MAPPER_GL)
- if (priv->redirectedWindow)
- priv->pageProxy->setAcceleratedCompositingWindowId(priv->redirectedWindow->windowId());
+ priv->pageProxy->setAcceleratedCompositingWindowId(priv->redirectedWindow->windowId());
#endif
}
@@ -932,9 +928,37 @@ GdkEvent* webkitWebViewBaseTakeContextMenuEvent(WebKitWebViewBase* webkitWebView
}
#if USE(TEXTURE_MAPPER_GL)
-void redirectedWindowDamagedCallback(void* data)
+static gboolean queueAnotherDrawOfAcceleratedCompositingResults(gpointer* webViewBasePointer)
{
- gtk_widget_queue_draw(GTK_WIDGET(data));
+ // The WebViewBase may have been destroyed in the time since we queued this
+ // draw and the time we are actually executing.
+ if (!*webViewBasePointer) {
+ fastFree(webViewBasePointer);
+ return FALSE;
+ }
+
+ WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(*webViewBasePointer);
+ gtk_widget_queue_draw(GTK_WIDGET(webViewBase));
+ webViewBase->priv->readyToRenderAcceleratedCompositingResults = true;
+
+ g_object_remove_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer);
+ fastFree(webViewBasePointer);
+
+ return FALSE;
+}
+
+void webkitWebViewBaseQueueDrawOfAcceleratedCompositingResults(WebKitWebViewBase* webViewBase)
+{
+ gtk_widget_queue_draw(GTK_WIDGET(webViewBase));
+
+ // Redraw again, one frame later, as it might take some time for the new GL frame to be available.
+ // This prevents the display from always being one frame behind in the case GL hasn't yet finished
+ // rendering to the window.
+ // TODO: Add XDamage support to RedirectedXCompositeWindow to accomplish this.
+ gpointer* webViewBasePointer = static_cast<gpointer*>(fastMalloc(sizeof(gpointer)));
+ g_object_add_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer);
+ *webViewBasePointer = webViewBase;
+ g_timeout_add(1000 / 60, reinterpret_cast<GSourceFunc>(queueAnotherDrawOfAcceleratedCompositingResults), webViewBasePointer);
}
#endif