LayoutTests/ChangeLog

 12009-09-16 Simon Fraser <simon.fraser@apple.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Elements appear behind <video> when they should be in front sometimes
 6 https://bugs.webkit.org/show_bug.cgi?id=29314
 7
 8 Testcase for a div layered on top of a video element, with a particular configuration
 9 of position and opacity.
 10
 11 * compositing/geometry/video-opacity-overlay.html: Added.
 12 * platform/mac/compositing/geometry/video-opacity-overlay-expected.checksum: Added.
 13 * platform/mac/compositing/geometry/video-opacity-overlay-expected.png: Added.
 14 * platform/mac/compositing/geometry/video-opacity-overlay-expected.txt: Added.
 15
1162009-09-14 Andrew Richards <randrew@gmail.com>
217
318 Reviewed by Sam Weinig.

LayoutTests/compositing/geometry/video-opacity-overlay.html

 1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 2 "http://www.w3.org/TR/html4/strict.dtd">
 3<html>
 4<head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 6 <title>Video overlay</title>
 7 <style type="text/css" media="screen">
 8 video {
 9 width: 100%;
 10 height: 100%;
 11 }
 12
 13 .container {
 14 position: relative;
 15 width: 400px;
 16 height: 300px;
 17 border: 1px solid black;
 18 }
 19
 20 .controls {
 21 opacity: 0.8;
 22 height: 10px;
 23 width: 10px;
 24 background-color: green;
 25 }
 26
 27 #control-bar {
 28 position: absolute;
 29 left: 0;
 30 bottom: 0px;
 31 width: 100%;
 32 height: 60px;
 33 background-color: orange;
 34 }
 35 </style>
 36 <script type="text/javascript" charset="utf-8">
 37 if (window.layoutTestController)
 38 layoutTestController.waitUntilDone();
 39 </script>
 40</head>
 41<body>
 42 <p>The orange bar should be in front of the video.</p>
 43 <div class="container">
 44 <video src="../resources/video.mp4"></video>
 45 <div class="controls" id="controls">
 46 <div id="control-bar"></div>
 47 </div>
 48 </div>
 49 <script type="text/javascript" charset="utf-8">
 50 var video = document.getElementsByTagName('video')[0];
 51 video.addEventListener('canplaythrough', function() {
 52 if (window.layoutTestController)
 53 layoutTestController.notifyDone();
 54 }, false);
 55 </script>
 56</body>
 57</html>

LayoutTests/platform/mac/compositing/geometry/video-opacity-overlay-expected.checksum

 1e61b80919edefd127b2d11d3f8a65adf
02\ No newline at end of file

LayoutTests/platform/mac/compositing/geometry/video-opacity-overlay-expected.png

index 0000000..d4c9f7b
Binary files /dev/null and b/LayoutTests/platform/mac/compositing/geometry/video-opacity-overlay-expected.png differ

LayoutTests/platform/mac/compositing/geometry/video-opacity-overlay-expected.txt

 1layer at (0,0) size 800x600
 2 RenderView at (0,0) size 800x600
 3layer at (0,0) size 800x360
 4 RenderBlock {HTML} at (0,0) size 800x360
 5 RenderBody {BODY} at (8,16) size 784x336
 6 RenderBlock {P} at (0,0) size 784x18
 7 RenderText {#text} at (0,0) size 294x18
 8 text run at (0,0) width 294: "The orange bar should be in front of the video."
 9layer at (8,50) size 402x305
 10 RenderBlock (relative positioned) {DIV} at (0,34) size 402x302 [border: (1px solid #000000)]
 11 RenderBlock (anonymous) at (1,1) size 400x304
 12 RenderText {#text} at (0,0) size 0x0
 13layer at (9,51) size 400x300
 14 RenderVideo {VIDEO} at (0,0) size 400x300
 15layer at (9,355) size 10x10
 16 RenderBlock {DIV} at (1,305) size 10x10 [bgcolor=#008000]
 17layer at (9,291) size 400x60
 18 RenderBlock (positioned) {DIV} at (1,241) size 400x60 [bgcolor=#FFA500]

WebCore/ChangeLog

 12009-09-16 Simon Fraser <simon.fraser@apple.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Elements appear behind <video> when they should be in front sometimes
 6 https://bugs.webkit.org/show_bug.cgi?id=29314
 7
 8 r45598 added logic that tests for overlap with <video> to determine when to throw
 9 a layer into compositing mode. That logic was incorrect in some cases, and this patch
 10 fixes it. When testing overlap, the layer needs to be composited iff some previous layer
 11 is composited (which adds a rect to the overlay map), and there is overlap.
 12
 13 Test: compositing/geometry/video-opacity-overlay.html
 14
 15 * rendering/RenderLayerCompositor.cpp:
 16 (WebCore::CompositingState::CompositingState):
 17 (WebCore::RenderLayerCompositor::computeCompositingRequirements):
 18
1192009-09-15 Alex Milowski <alex@milowski.com>
220
321 Reviewed by Tor Arne Vestbø.

WebCore/rendering/RenderLayerCompositor.cpp

@@bool WebCoreHas3DRendering = true;
5959namespace WebCore {
6060
6161struct CompositingState {
62  CompositingState(RenderLayer* compAncestor)
 62 CompositingState(RenderLayer* compAncestor, bool earlierLayerIsCompositing = false)
6363 : m_compositingAncestor(compAncestor)
6464 , m_subtreeIsCompositing(false)
 65 , m_earlierLayerIsCompositing(earlierLayerIsCompositing)
6566#ifndef NDEBUG
6667 , m_depth(0)
6768#endif

@@struct CompositingState {
6970 }
7071
7172 RenderLayer* m_compositingAncestor;
72  bool m_subtreeIsCompositing;
 73 bool m_subtreeIsCompositing; // whether the current subtree is compositing
 74 bool m_earlierLayerIsCompositing; // whether some layer earlier in the z-order hierarchy is compositing
7375#ifndef NDEBUG
7476 int m_depth;
7577#endif

@@void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
431433
432434 bool haveComputedBounds = false;
433435 IntRect absBounds;
434  if (overlapMap && mustOverlapCompositedLayers) {
 436 if (overlapMap && compositingState.m_earlierLayerIsCompositing) {
435437 // If we're testing for overlap, we only need to composite if we overlap something that is already composited.
436438 absBounds = layer->renderer()->localToAbsoluteQuad(FloatRect(layer->localBoundingBox())).enclosingBoundingBox();
437439 haveComputedBounds = true;
438  mustOverlapCompositedLayers &= overlapsCompositedLayers(*overlapMap, absBounds);
 440 mustOverlapCompositedLayers = overlapsCompositedLayers(*overlapMap, absBounds);
439441 }
440442
441443 layer->setMustOverlapCompositedLayers(mustOverlapCompositedLayers);

@@void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
443445 // The children of this layer don't need to composite, unless there is
444446 // a compositing layer among them, so start by inheriting the compositing
445447 // ancestor with m_subtreeIsCompositing set to false.
446  CompositingState childState(compositingState.m_compositingAncestor);
 448 CompositingState childState(compositingState.m_compositingAncestor, compositingState.m_earlierLayerIsCompositing);
447449#ifndef NDEBUG
448450 ++childState.m_depth;
449451#endif

@@void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
516518 }
517519
518520 // Subsequent layers in the parent stacking context also need to composite.
519  if (childState.m_subtreeIsCompositing)
 521 if (childState.m_subtreeIsCompositing) {
520522 compositingState.m_subtreeIsCompositing = true;
 523 compositingState.m_earlierLayerIsCompositing = true;
 524 }
521525
522526 // If the layer is going into compositing mode, repaint its old location.
523527 if (!layer->isComposited() && needsToBeComposited(layer))