RESOLVED FIXED 3778
Plugins not occluded by fixed position objects with higher z-index
https://bugs.webkit.org/show_bug.cgi?id=3778
Summary Plugins not occluded by fixed position objects with higher z-index
chris habib
Reported 2005-06-30 14:07:28 PDT
on the right side of the page (tour journal 2005: turkey) if you scroll in safari, the ebedded quicktime renders above the page elements at the top of the page while the text correctly hides beneath it. this bug does not exist in firefox or IE on os x or windows.
Attachments
Reduction of the problem (1.08 KB, text/xhtml)
2005-07-04 12:19 PDT, David Storey
no flags
Related Reduction (1.22 KB, text/html)
2006-04-23 17:43 PDT, Seth A. Roby
no flags
Patch (14.88 KB, patch)
2011-07-16 13:13 PDT, Robert Hogan
no flags
Patch (20.15 KB, patch)
2011-08-04 12:52 PDT, Robert Hogan
no flags
rebase prev patch to HEAD (19.21 KB, patch)
2012-11-22 00:11 PST, Matt Falkenhagen
buildbot: commit-queue-
Oliver Hunt
Comment 1 2005-06-30 23:20:40 PDT
This is reproducable in current ToT
Joost de Valk (AlthA)
Comment 2 2005-07-01 05:35:19 PDT
it's the left side of the page here, but i can reproduce it :). confirming.
David Storey
Comment 3 2005-07-04 12:19:26 PDT
Created attachment 2794 [details] Reduction of the problem Text, images and the movies control bar seem to work correctly, it's just the movie window itself
Alice Liu
Comment 4 2005-11-17 18:47:04 PST
Seth A. Roby
Comment 5 2006-04-23 17:43:31 PDT
Created attachment 7930 [details] Related Reduction This is a very similar case where the QuickTime movie overlaps a fixed area that it should scroll under. It appears that QuickTime fails to properly inherit the z-index.
river
Comment 6 2006-12-10 14:02:44 PST
the same thing happens with flash movies. when they are positioned in a div with scrolling overflow the browser continues to render the flash element once it's outside of the div and should not be visible. http://dev.exit3a.com/main.html
Robert Hogan
Comment 7 2011-07-16 13:13:55 PDT
Robert Hogan
Comment 8 2011-07-16 13:20:34 PDT
A fixed position element should occlude a plugin if it has a higher index. Though firefox and opera both have some odd rules for this. The fixed position element will only occlude the plugin, regardless of z index, if: - It has a non-transparent background - It's not a form control, e.g. an input element I cannot find any source to explain this behaviour so instead of mimicking it I've implemented what seems the correct thing to do in the absence of a spec - allow fixed position elements to always occlude a plugin if they have a higher z index. If the z-index is equal, the plugin will also get occluded - based on the fact that the use-case of fixed position elements is to keep them always in view.
Robert Hogan
Comment 9 2011-07-16 13:22:01 PDT
(In reply to comment #7) > Created an attachment (id=101095) [details] > Patch Note that IFrameShimSupport needs to be changed to something like PluginOcclusions - but I did not rename in this patch as it would obscure the changes to the file in the patch.
Simon Fraser (smfr)
Comment 10 2011-07-18 10:48:28 PDT
Comment on attachment 101095 [details] Patch The code should be walking the RenderLayer z-order tree to determine stacking, rather than trying to do it itself.
Robert Hogan
Comment 11 2011-08-04 12:52:32 PDT
Robert Hogan
Comment 12 2011-08-08 12:19:26 PDT
(In reply to comment #10) > (From update of attachment 101095 [details]) > The code should be walking the RenderLayer z-order tree to determine stacking, rather than trying to do it itself. Hi Simon, I've taken your advice and use the RenderLayer to implement occluding plugins by all elements, be they iframes or otherwise. It results in substantially less code. Could you take another look when you get the chance? Darin, since this rewrites the iframe shim support, could you also take a look? Thanks, Robert
Simon Fraser (smfr)
Comment 13 2011-08-16 10:47:34 PDT
Comment on attachment 102961 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=102961&action=review Is the RenderLayer tree guaranteed to be current when getPluginOcclusions() is called? Are those plugin methods called during layout? > Source/WebCore/plugins/IFrameShimSupport.cpp:65 > + layer->dirtyZOrderLists(); Why are you dirtying the z-order lists here? > Source/WebCore/plugins/IFrameShimSupport.cpp:79 > + if (layer == element->renderer()->enclosingLayer()) { You should put element->renderer()->enclosingLayer() in a local variable. It's called to get the initial 'sc' too. > Source/WebCore/plugins/IFrameShimSupport.cpp:100 > + for (RenderLayer* child = layer->firstChild(); child; child = child->nextSibling()) > + if (child->renderer()->hasBackground()) > + appendOcclusion(toRenderBox(child->renderer()), occlusions); Why is this looking at layer children, not renderer children?
Robert Hogan
Comment 14 2011-08-16 11:32:39 PDT
(In reply to comment #13) > (From update of attachment 102961 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=102961&action=review > > Is the RenderLayer tree guaranteed to be current when getPluginOcclusions() is called? Are those plugin methods called during layout? getPluginOcclusions() is called during layout, but I'm not sure that the RenderLayer tree is current when it is called. How can I ensure that it is apart from calling updateZOrderLists()? > > > Source/WebCore/plugins/IFrameShimSupport.cpp:65 > > + layer->dirtyZOrderLists(); > > Why are you dirtying the z-order lists here? A leftover from when I was getting the hang of the zorder list. > > Source/WebCore/plugins/IFrameShimSupport.cpp:100 > > + for (RenderLayer* child = layer->firstChild(); child; child = child->nextSibling()) > > + if (child->renderer()->hasBackground()) > > + appendOcclusion(toRenderBox(child->renderer()), occlusions); > > Why is this looking at layer children, not renderer children? Simply because iterating through the layers was the first thing that occurred to me and it worked. Why is using the renderer children more correct?
Robert Hogan
Comment 15 2011-08-16 12:53:47 PDT
(In reply to comment #14) > (In reply to comment #13) > > (From update of attachment 102961 [details] [details]) > > View in context: https://bugs.webkit.org/attachment.cgi?id=102961&action=review > > > > Is the RenderLayer tree guaranteed to be current when getPluginOcclusions() is called? Are those plugin methods called during layout? > > getPluginOcclusions() is called during layout... This is incorrect, it's called when the plugin is getting painted, so at that point layout is meant to be complete. I've updated the patch per your other comments.
Robert Hogan
Comment 16 2011-08-21 11:55:56 PDT
When revising the patch I noticed a problem with the layout test, and in an effort to fix it discovered that the assumptions behind the current plugins/iframe-shims.html and my new test are wrong. The current iframe-shims.html test passes even when no attempt is made to occlude the plugin (by commenting out the call to getPluginOcclusions()). Both tests work fine manually (using QtTestBrowser for example), but the behaviour of the hit testing when run from DumpRenderTree does not depend at all on whether the plugins occlude the elements above/below them or not. It's not due to using flash plugins in the tests as the same problem exhibits with the test netscape plugin. I suspect the problem is the use of windowed plugins run from DumpRenderTree without displaying the webview. So it's possible to fix this bug, but currently not possible to write a test for it, and the existing plugins/iframe-shims.html test will continue to pass even if a regression happens. Any suggestions how to proceed? I'm stuck.
Eric Seidel (no email)
Comment 17 2012-01-09 13:19:10 PST
Can we make TestNetscapePlugin not windowed? Or have a not-windowed plugin? We certainly use flash in other layout tests, seems we could use it here too.
Eric Seidel (no email)
Comment 18 2012-01-09 13:19:29 PST
Comment on attachment 102961 [details] Patch Based on smfr's comments, seems this needs at least one more round.
Cem Kocagil
Comment 19 2012-07-06 01:49:13 PDT
Any progress on this bug?
Robert Hogan
Comment 20 2012-07-06 10:23:23 PDT
(In reply to comment #19) > Any progress on this bug? I think the code-change is good - but it's extremely hard to create a valid test. The current z-pos/plugin testing coverage ( plugins/iframe-shims.html) is not valid either and will happily pass even plugin occlusions regress. I would love a manual-test pass on this one as the effort/investigation required to get the testing working (some kind of fu required in TestNetscapePlugin) has eluded me. It's not windowed/not-windowed - it is more to do with the need to get a painted background going in TestNetscapePlugin so that the hit-testing can work properly.
Matt Falkenhagen
Comment 21 2012-11-22 00:11:38 PST
Created attachment 175605 [details] rebase prev patch to HEAD
Matt Falkenhagen
Comment 22 2012-11-22 00:20:55 PST
I updated Robert's patch for a current checkout. Two changes were needed: - In getPluginOcclusions, replaced layer->dirtyZOrderLists(); layer->updateZOrderLists(); // this is now private with layer->updateLayerListsIfNeeded(); - PluginViewQt.cpp cannot be patched, as the getPluginOcclusions() call was removed in http://trac.webkit.org/changeset/124879 It's too bad a layout test is difficult due to hit testing for plugins run in DumpRenderTree. I guess just a pixel test is also hard?
Build Bot
Comment 23 2012-11-22 03:36:48 PST
Comment on attachment 175605 [details] rebase prev patch to HEAD Attachment 175605 [details] did not pass mac-ews (mac): Output: http://queues.webkit.org/results/14959291 New failing tests: plugins/fixed-position-object-occludes-plugin.html
Simon Fraser (smfr)
Comment 24 2013-02-07 12:47:17 PST
Comment on attachment 175605 [details] rebase prev patch to HEAD Ist this change Chromium-only? If so, the bug title should be prepended with [Chromium]
Eric Seidel (no email)
Comment 25 2013-02-07 13:07:35 PST
This is an ancient 4-digit bug. :) Robert was reporting that this occurs for him on Chromium Linux with NPAPI flash. But I'm not able to reproduce this bug on either Safari or Chrome (with built-in PPAPI flash) on my Mac.
Eric Seidel (no email)
Comment 26 2013-02-07 13:08:05 PST
This original reporter used the QuickTime plugin in Safari.
Anders Carlsson
Comment 27 2013-09-01 10:54:09 PDT
This bug was reported against Mac, and this has been working correctly on Mac since at least Snow Leopard.
Note You need to log in before you can comment on or make changes to this bug.