Title: [252070] trunk
- Revision
- 252070
- Author
- [email protected]
- Date
- 2019-11-05 12:11:32 -0800 (Tue, 05 Nov 2019)
Log Message
Content can disappear with a combination of <video> with controls and clipping
https://bugs.webkit.org/show_bug.cgi?id=203834
Source/WebCore:
rdar://problem/56559648
Reviewed by Zalan Bujtas.
<video> with controls triggered a bug where a backing-sharing layer also claimed
that it didn't need any backing store. RenderLayerCompositor::requiresOwnBackingStore()
could early-return with 'false' if a layer had an indirect compositing reason of "Clipping",
while also backing-sharing. We need to check for backing-sharing first.
Test: compositing/shared-backing/clipping-and-shared-backing.html
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::setBackingSharingLayers):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresOwnBackingStore const):
LayoutTests:
Reviewed by Zalan Bujtas.
* compositing/shared-backing/clipping-and-shared-backing-expected.html: Added.
* compositing/shared-backing/clipping-and-shared-backing.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (252069 => 252070)
--- trunk/LayoutTests/ChangeLog 2019-11-05 20:10:01 UTC (rev 252069)
+++ trunk/LayoutTests/ChangeLog 2019-11-05 20:11:32 UTC (rev 252070)
@@ -1,3 +1,13 @@
+2019-11-05 Simon Fraser <[email protected]>
+
+ Content can disappear with a combination of <video> with controls and clipping
+ https://bugs.webkit.org/show_bug.cgi?id=203834
+
+ Reviewed by Zalan Bujtas.
+
+ * compositing/shared-backing/clipping-and-shared-backing-expected.html: Added.
+ * compositing/shared-backing/clipping-and-shared-backing.html: Added.
+
2019-11-05 Said Abou-Hallawa <[email protected]>
Disabled SVG shapes should not be hit
Added: trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing-expected.html (0 => 252070)
--- trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing-expected.html (rev 0)
+++ trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing-expected.html 2019-11-05 20:11:32 UTC (rev 252070)
@@ -0,0 +1,42 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
+<html>
+<head>
+ <style>
+ .wrapper {
+ overflow-x: hidden;
+ margin: 20px 50px;
+ }
+
+ .video {
+ width: 300px;
+ height: 100px;
+ will-change: transform;
+ }
+
+ .obscurer {
+ position: absolute;
+ top: 18px;
+ left: 48px;
+ width: 320px;
+ height: 120px;
+ background-color: gray;
+ }
+
+ .test {
+ position: relative;
+ width: 100%;
+ height: 300px;
+ background-color: green;
+ }
+ </style>
+</head>
+<body>
+ <section class="wrapper">
+ <div class="video"></div>
+ <div class="test">Some text here</div>
+ </section>
+ <!--Hide the video; we just want its side-effects -->
+ <div class="obscurer"></div>
+
+</body>
+</html>
Added: trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing.html (0 => 252070)
--- trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing.html (rev 0)
+++ trunk/LayoutTests/compositing/shared-backing/clipping-and-shared-backing.html 2019-11-05 20:11:32 UTC (rev 252070)
@@ -0,0 +1,59 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
+<html>
+<head>
+ <style>
+ .wrapper {
+ overflow-x: hidden;
+ margin: 20px 50px;
+ }
+
+ video {
+ display: block;
+ width: 300px;
+ height: 100px;
+ }
+
+ .obscurer {
+ position: absolute;
+ top: 18px;
+ left: 48px;
+ width: 320px;
+ height: 120px;
+ background-color: gray;
+ }
+
+ .test {
+ position: relative;
+ width: 100%;
+ height: 300px;
+ background-color: green;
+ }
+ </style>
+ <script src=""
+ <script src=""
+ <script>
+ if (window.testRunner)
+ testRunner.waitUntilDone();
+
+ function setupTest()
+ {
+ var video = document.getElementsByTagName('video')[0];
+ setupVideo(video, '../resources/video', null, () => {
+ if (window.testRunner)
+ testRunner.notifyDone();
+ });
+ }
+
+ window.addEventListener('load', setupTest, false);
+ </script>
+</head>
+<body>
+ <section class="wrapper">
+ <video ></video>
+ <div class="test">Some text here</div>
+ </section>
+ <!--Hide the video; we just want its side-effects -->
+ <div class="obscurer"></div>
+
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (252069 => 252070)
--- trunk/Source/WebCore/ChangeLog 2019-11-05 20:10:01 UTC (rev 252069)
+++ trunk/Source/WebCore/ChangeLog 2019-11-05 20:11:32 UTC (rev 252070)
@@ -1,3 +1,23 @@
+2019-11-05 Simon Fraser <[email protected]>
+
+ Content can disappear with a combination of <video> with controls and clipping
+ https://bugs.webkit.org/show_bug.cgi?id=203834
+ rdar://problem/56559648
+
+ Reviewed by Zalan Bujtas.
+
+ <video> with controls triggered a bug where a backing-sharing layer also claimed
+ that it didn't need any backing store. RenderLayerCompositor::requiresOwnBackingStore()
+ could early-return with 'false' if a layer had an indirect compositing reason of "Clipping",
+ while also backing-sharing. We need to check for backing-sharing first.
+
+ Test: compositing/shared-backing/clipping-and-shared-backing.html
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::setBackingSharingLayers):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::requiresOwnBackingStore const):
+
2019-11-05 Said Abou-Hallawa <[email protected]>
Disabled SVG shapes should not be hit
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (252069 => 252070)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2019-11-05 20:10:01 UTC (rev 252069)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2019-11-05 20:11:32 UTC (rev 252070)
@@ -294,8 +294,11 @@
clearBackingSharingLayerProviders(m_backingSharingLayers);
- if (sharingLayers != m_backingSharingLayers)
+ if (sharingLayers != m_backingSharingLayers) {
+ if (sharingLayers.size())
+ setRequiresOwnBackingStore(true);
setContentsNeedDisplay(); // This could be optimized to only repaint rects for changed layers.
+ }
auto oldSharingLayers = WTFMove(m_backingSharingLayers);
m_backingSharingLayers = WTFMove(sharingLayers);
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (252069 => 252070)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2019-11-05 20:10:01 UTC (rev 252069)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2019-11-05 20:11:32 UTC (rev 252070)
@@ -2422,6 +2422,9 @@
|| renderer.hasBackdropFilter())
return true;
+ if (layer.isComposited() && layer.backing()->hasBackingSharingLayers())
+ return true;
+
if (layer.mustCompositeForIndirectReasons()) {
IndirectCompositingReason reason = layer.indirectCompositingReason();
return reason == IndirectCompositingReason::Overlap
@@ -2432,12 +2435,10 @@
|| reason == IndirectCompositingReason::Preserve3D; // preserve-3d has to create backing store to ensure that 3d-transformed elements intersect.
}
+ // FIXME: We really need to keep track of the ancestor layer that has its own backing store.
if (!ancestorCompositedBounds.contains(layerCompositedBoundsInAncestor))
return true;
- if (layer.isComposited() && layer.backing()->hasBackingSharingLayers())
- return true;
-
return false;
}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes