RESOLVED FIXED Bug 90085
[GTK] Using a native window for the WebView breaks GtkOverlay
https://bugs.webkit.org/show_bug.cgi?id=90085
Summary [GTK] Using a native window for the WebView breaks GtkOverlay
Carlos Garcia Campos
Reported 2012-06-27 11:07:44 PDT
Which is the case of epiphany, the child widgets of the GtkOverlay are not shown when webkit is built with AC enabled. The problem happens with WebKit1 and WebKit2, and I've checked that it doesn't happen when building without AC (I used --disable-accelerated-compositing --disable-webgl --with-acceleration-backend=none configure options, it needs a patch to build with those flags, though). I think we should fix the build with AC disabled, and disable it by default until the problem is fixed beause it breaks important basic features in epiphany (loading progress bar, hovered link messages and fullscreen message box)
Attachments
Patch (44.41 KB, patch)
2012-07-06 11:12 PDT, Martin Robinson
no flags
Add xcomposite pkg-config parsing to configuration, fix some assertions, and improve performance on the 2012 beercamp demo (47.40 KB, patch)
2012-07-13 14:59 PDT, Martin Robinson
no flags
Patch (47.38 KB, patch)
2012-08-10 10:21 PDT, Martin Robinson
no flags
Patch fixing issues with scrolling (54.60 KB, patch)
2012-08-17 10:49 PDT, Martin Robinson
no flags
Patch (54.55 KB, patch)
2012-08-19 23:38 PDT, Martin Robinson
no flags
Patch (54.58 KB, patch)
2012-08-20 07:46 PDT, Martin Robinson
no flags
Patch (54.49 KB, patch)
2012-08-21 08:20 PDT, Martin Robinson
no flags
Patch (51.71 KB, patch)
2012-08-21 11:33 PDT, Martin Robinson
alex: review+
Carlos Garcia Campos
Comment 1 2012-06-27 11:10:51 PDT
Btw, the OSD style class is relevant because it uses a transparent background for the GtkOverlay, so it's a problem with transparencies.
Martin Robinson
Comment 2 2012-06-27 17:55:19 PDT
A quick update debugging this issue. It seems that the root of the problem is that GtkOverlay does not react well when the background widget has its own native window. This feels like a bug in GTK+, but I'm still digging for the cause. What we know so far is that GtkOverlay creates child windows for all its overlaid widgets and calls gtk_widget_set_parent_window on them. I'm going to try to explore whether or not the overlaid widget windows are just hiding behind the WebView window for some reason.
Carlos Garcia Campos
Comment 3 2012-06-27 23:08:43 PDT
I tried lowering and raising the child windows in the z-order and it didn't work. Note that it works even with AC enabled if the overlay uses an opaque background color. It seems the problem has to do with the way things are composed.
Martin Robinson
Comment 4 2012-07-01 16:32:06 PDT
Another update: I haven't spent any time looking at the GTK+ bug, but I've successfully eliminated the need to have a native window for accelerated compositing support using XComposite to redirect a window a pixmap. This approach has quite a few other benefits as well such as allowing us to do pixel tests with accelerated compositing and 3D CSS transforms. I have the patch cooking locally, but I hope to post it early next week. If there's a release coming up, I'm fine with disabling accelerated compositing for the moment. I wanted to delay turning it off in the case that the fix was simple. Again I hope to post the patch within a few days though.
Carlos Garcia Campos
Comment 5 2012-07-01 23:58:54 PDT
(In reply to comment #4) > Another update: I haven't spent any time looking at the GTK+ bug, but I've successfully eliminated the need to have a native window for accelerated compositing support using XComposite to redirect a window a pixmap. This approach has quite a few other benefits as well such as allowing us to do pixel tests with accelerated compositing and 3D CSS transforms. Great news. > I have the patch cooking locally, but I hope to post it early next week. If there's a release coming up, I'm fine with disabling accelerated compositing for the moment. I wanted to delay turning it off in the case that the fix was simple. Sure. > Again I hope to post the patch within a few days though.
Martin Robinson
Comment 6 2012-07-06 11:12:58 PDT
Martin Robinson
Comment 7 2012-07-13 14:59:37 PDT
Created attachment 152344 [details] Add xcomposite pkg-config parsing to configuration, fix some assertions, and improve performance on the 2012 beercamp demo
Martin Robinson
Comment 8 2012-08-10 10:21:06 PDT
Martin Robinson
Comment 9 2012-08-17 10:49:45 PDT
Created attachment 159158 [details] Patch fixing issues with scrolling
Carlos Garcia Campos
Comment 10 2012-08-19 03:32:43 PDT
Comment on attachment 159158 [details] Patch fixing issues with scrolling View in context: https://bugs.webkit.org/attachment.cgi?id=159158&action=review > Source/WebCore/platform/gtk/RedirectedXCompositeWindow.cpp:103 > + cleanupPixmapAndPixmapSurface(); You should probably remove the source if m_pendingResizeSourceId > 0 to avoid the callback could be called on a destroyed object. > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:115 > +bool AcceleratedCompositingContext::renderLayersToWindow(cairo_t* cr, const IntRect& clipRect) clipRect is passed but it doesn't seem to be used, is it really needed? > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:135 > + > + Extra line here? > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:228 > + if (m_layerFlushTimerCallbackId) { > + g_source_remove(m_layerFlushTimerCallbackId); > + m_layerFlushTimerCallbackId = 0; > + } This is done 3 times, maybe you could add a helper clearLayerFlushTimerSource() or seomthing similar. > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:321 > + { > + Frame* frame = core(m_webView)->mainFrame(); > + if (!frame || !frame->contentRenderer() || !frame->view()) > + return; > + frame->view()->updateLayoutAndStyleIfNeededRecursive(); > + } why the braces? > Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp:1010 > + IntRect webViewRect = getWebViewRect(m_webView); > + if (turningOnCompositing) { > + m_displayTimer.stop(); > + m_webView->priv->backingStore = WebCore::WidgetBackingStore::create(GTK_WIDGET(m_webView), IntSize(1, 1)); > + } > + > + if (turningOffCompositing) { > + m_webView->priv->backingStore = WebCore::WidgetBackingStore::create(GTK_WIDGET(m_webView), webViewRect.size()); > + RefPtr<cairo_t> cr = adoptRef(cairo_create(m_webView->priv->backingStore->cairoSurface())); > + clearEverywhereInBackingStore(m_webView, cr.get()); > + } webViewRect is only used when turning compositing off, so it could be moved here and maybe don't use a local variable: m_webView->priv->backingStore = WebCore::WidgetBackingStore::create(GTK_WIDGET(m_webView), getWebViewRect().size());
Martin Robinson
Comment 11 2012-08-19 23:34:41 PDT
(In reply to comment #10) Thanks for the review! > (From update of attachment 159158 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=159158&action=review > > > Source/WebCore/platform/gtk/RedirectedXCompositeWindow.cpp:103 > > + cleanupPixmapAndPixmapSurface(); > > You should probably remove the source if m_pendingResizeSourceId > 0 to avoid the callback could be called on a destroyed object. Okay. > > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:115 > > +bool AcceleratedCompositingContext::renderLayersToWindow(cairo_t* cr, const IntRect& clipRect) > > clipRect is passed but it doesn't seem to be used, is it really needed? It can't be removed, because it might be used by the other implementations. In fact, I'll use it here to speed up painting AC results after damage events. > > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:135 > > + > > + > > Extra line here? Removed. > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:228 > > + if (m_layerFlushTimerCallbackId) { > > + g_source_remove(m_layerFlushTimerCallbackId); > > + m_layerFlushTimerCallbackId = 0; > > + } > > This is done 3 times, maybe you could add a helper clearLayerFlushTimerSource() or seomthing similar. Okay. > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:321 > > + { > > + Frame* frame = core(m_webView)->mainFrame(); > > + if (!frame || !frame->contentRenderer() || !frame->view()) > > + return; > > + frame->view()->updateLayoutAndStyleIfNeededRecursive(); > > + } > > why the braces? There was a smart pointer in an older implementation. I've removed them. > webViewRect is only used when turning compositing off, so it could be moved here and maybe don't use a local variable: Sounds good.
Martin Robinson
Comment 12 2012-08-19 23:38:20 PDT
Carlos Garcia Campos
Comment 13 2012-08-20 00:20:16 PDT
Comment on attachment 159341 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=159341&action=review > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:-60 > - if (m_syncTimerCallbackId) > - g_source_remove(m_syncTimerCallbackId); This should be now stopAnyPendingLayerFlush();
Martin Robinson
Comment 14 2012-08-20 07:46:45 PDT
Carlos Garcia Campos
Comment 15 2012-08-21 06:50:30 PDT
Comment on attachment 159426 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=159426&action=review > Source/WebCore/platform/graphics/glx/GLContextGLX.cpp:108 > + static int framebufferAttributes[] = { > + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, > + GLX_DOUBLEBUFFER, bufferingType == DoubleBuffer ? True : False, > + GLX_RENDER_TYPE, GLX_RGBA_BIT, > + GLX_RED_SIZE, 1, > + GLX_GREEN_SIZE, 1, > + GLX_BLUE_SIZE, 1, > + GLX_STENCIL_SIZE, 1, > + None > + }; if this is static, GLX_DOUBLEBUFFER would only be initialized the first time with whatever bufferingType is, no? > Source/WebCore/platform/graphics/glx/GLContextGLX.cpp:114 > + if (!numberReturned || !configs) > + return nullptr; is configs leaked here if !numberReturned? or glXChooseFBConfig never sets numberReturned=0?
Martin Robinson
Comment 16 2012-08-21 07:44:33 PDT
(In reply to comment #15) > (From update of attachment 159426 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=159426&action=review > > > Source/WebCore/platform/graphics/glx/GLContextGLX.cpp:108 > > + static int framebufferAttributes[] = { > > + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, > > + GLX_DOUBLEBUFFER, bufferingType == DoubleBuffer ? True : False, > > + GLX_RENDER_TYPE, GLX_RGBA_BIT, > > + GLX_RED_SIZE, 1, > > + GLX_GREEN_SIZE, 1, > > + GLX_BLUE_SIZE, 1, > > + GLX_STENCIL_SIZE, 1, > > + None > > + }; > > if this is static, GLX_DOUBLEBUFFER would only be initialized the first time with whatever bufferingType is, no? Nice catch! This isn't a huge deal since there's no double-buffered GLContexts at the moment, but I've fixed this. > > Source/WebCore/platform/graphics/glx/GLContextGLX.cpp:114 > > + if (!numberReturned || !configs) > > + return nullptr; > > is configs leaked here if !numberReturned? or glXChooseFBConfig never sets numberReturned=0? I believe that when numberReturned == 0, configs will always be null.
Martin Robinson
Comment 17 2012-08-21 08:20:40 PDT
Martin Robinson
Comment 18 2012-08-21 11:33:08 PDT
Alejandro G. Castro
Comment 19 2012-08-21 12:45:38 PDT
Comment on attachment 159728 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=159728&action=review Great patch, LGTM. This seems the way to go. > Source/WebCore/platform/gtk/RedirectedXCompositeWindow.cpp:66 > + m_parentWindow = XCreateWindow(display, > + RootWindow(display, DefaultScreen(display)), > + -100, -100, 1, 1, > + 0, > + CopyFromParent, > + InputOutput, > + CopyFromParent, > + CWOverrideRedirect, > + &windowAttributes); Indent typo. > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContext.h:-81 > -#if USE(TEXTURE_MAPPER_GL) > WebCore::GLContext* glContext(); > OwnPtr<WebCore::GLContext> m_context; > #endif > -#endif Why do you remove this #if? > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:193 > + // called. For non-animation situations we use this terrible hack until we can get to the Trailing whitespace in horrible hack comment ;). > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:216 > + // to update. This isn't a problem during animations, because swapBuffer is continuously Ditto. > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:348 > + // return; I guess this is a leftover.
Martin Robinson
Comment 20 2012-08-21 13:28:48 PDT
Martin Robinson
Comment 21 2012-08-21 13:30:37 PDT
(In reply to comment #19) Thanks for the review! > > Source/WebCore/platform/gtk/RedirectedXCompositeWindow.cpp:66 > > + m_parentWindow = XCreateWindow(display, > > + RootWindow(display, DefaultScreen(display)), > > + -100, -100, 1, 1, > > + 0, > > + CopyFromParent, > > + InputOutput, > > + CopyFromParent, > > + CWOverrideRedirect, > > + &windowAttributes); > > Indent typo. Fixed. > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContext.h:-81 > > -#if USE(TEXTURE_MAPPER_GL) > > WebCore::GLContext* glContext(); > > OwnPtr<WebCore::GLContext> m_context; > > #endif > > -#endif > > Why do you remove this #if? I actually meant to remove these entirely. I've done that. > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:193 > > + // called. For non-animation situations we use this terrible hack until we can get to the > > Trailing whitespace in horrible hack comment ;). Fixed. > > Source/WebKit/gtk/WebCoreSupport/AcceleratedCompositingContextGL.cpp:348 > > + // return; > > I guess this is a leftover. I meant this to be if (!flush....) return;
WebKit Review Bot
Comment 22 2012-08-22 01:21:53 PDT
Re-opened since this is blocked by 94678
Daniel Drake
Comment 23 2012-10-09 10:10:58 PDT
r126182 a regression in plugin display, filed as bug #98789.
Note You need to log in before you can comment on or make changes to this bug.