Diff
Modified: trunk/LayoutTests/ChangeLog (211682 => 211683)
--- trunk/LayoutTests/ChangeLog 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/ChangeLog 2017-02-05 19:18:16 UTC (rev 211683)
@@ -1,3 +1,18 @@
+2017-02-04 Simon Fraser <simon.fra...@apple.com>
+
+ Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays
+ https://bugs.webkit.org/show_bug.cgi?id=167850
+
+ Reviewed by Tim Horton.
+
+ * pageoverlay/overlay-large-document-expected.txt:
+ * pageoverlay/overlay-large-document-scrolled-expected.txt:
+ * pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+ * pageoverlay/overlay-remove-reinsert-view.html: Added.
+ * platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+ * platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added.
+ * tiled-drawing/tiled-backing-in-window-expected.txt:
+
2017-02-05 Zalan Bujtas <za...@apple.com>
Simple line layout: Use RenderText::canUseSimpleFontCodePath() only as a hint.
Modified: trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt (211682 => 211683)
--- trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -8,7 +8,7 @@
(children 1
(GraphicsLayer
(anchor 0.00 0.00)
- (bounds 785.00 585.00)
+ (bounds 800.00 600.00)
(drawsContent 1)
(backgroundColor #00000000)
)
Modified: trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt (211682 => 211683)
--- trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -8,7 +8,7 @@
(children 1
(GraphicsLayer
(anchor 0.00 0.00)
- (bounds 785.00 585.00)
+ (bounds 800.00 600.00)
(drawsContent 1)
(backgroundColor #00000000)
)
Added: trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)
--- trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt (rev 0)
+++ trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -0,0 +1,76 @@
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 785, 585)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 785, 585)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+Layers after removal
+
+View-relative:
+(no view-relative overlay root)
+
+Document-relative:
+(no document-relative overlay root)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 785.00 585.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+
Added: trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html (0 => 211683)
--- trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html (rev 0)
+++ trunk/LayoutTests/pageoverlay/overlay-remove-reinsert-view.html 2017-02-05 19:18:16 UTC (rev 211683)
@@ -0,0 +1,87 @@
+<html>
+<style>
+body {
+ height: 5000px;
+ width: 5000px;
+}
+</style>
+<script>
+ if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+ }
+
+ function getWaitForPresentationUpdateUIScript()
+ {
+ return `
+ (function() {
+ uiController.doAfterPresentationUpdate(function() {
+ uiController.uiScriptComplete('');
+ });
+ })();`
+ }
+
+ function getUnparentUIScript()
+ {
+ return `
+ (function() {
+ uiController.removeViewFromWindow(function() {
+ uiController.uiScriptComplete('');
+ });
+ })();`
+ }
+
+ function getReinsertUIScript()
+ {
+ return `
+ (function() {
+ uiController.addViewToWindow(function() {
+ uiController.uiScriptComplete('');
+ });
+ })();`
+ }
+
+ function dumpLayers(outputId)
+ {
+ if (window.internals) {
+ document.getElementById(outputId).innerText = window.internals.pageOverlayLayerTreeAsText(internals.LAYER_TREE_INCLUDES_TILE_CACHES);
+ }
+ }
+
+ function doTest()
+ {
+ if (!window.testRunner || !testRunner.runUIScript)
+ return;
+
+ internals.installMockPageOverlay("document");
+ internals.installMockPageOverlay("view");
+
+ // Waiting for a presentation update is needed to get the document overlay to become tiled.
+ testRunner.runUIScript(getWaitForPresentationUpdateUIScript(), function(result) {
+ dumpLayers('before-layers');
+
+ testRunner.runUIScript(getUnparentUIScript(), function(result) {
+ dumpLayers('view-removed-layers');
+
+ testRunner.runUIScript(getReinsertUIScript(), function(result) {
+ dumpLayers('view-reinsertion-layers');
+ if (window.testRunner)
+ testRunner.notifyDone();
+ });
+ });
+ });
+ }
+
+ window.addEventListener('load', doTest, false);
+</script>
+<body>
+ <h2>Initial layers</h2>
+ <pre id="before-layers">Layer tree goes here</pre>
+
+ <h2>Layers after removal</h2>
+ <pre id="view-removed-layers">Layer tree goes here</pre>
+
+ <h2>Layers after re-insertion</h2>
+ <pre id="view-reinsertion-layers">Layer tree goes here</pre>
+</body>
+</html>
\ No newline at end of file
Added: trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)
--- trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -0,0 +1,100 @@
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 800, 600)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 800, 600)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+Layers after removal
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+
Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (211682 => 211683)
--- trunk/LayoutTests/platform/mac-wk1/TestExpectations 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations 2017-02-05 19:18:16 UTC (rev 211683)
@@ -305,3 +305,5 @@
webkit.org/b/163598 media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-buttons-styles.html [ Pass Timeout ]
webkit.org/b/167127 pointer-lock/locked-element-removed-from-dom.html
+
+webkit.org/b/167857 pageoverlay/overlay-remove-reinsert-view.html [ Skip ]
Added: trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt (0 => 211683)
--- trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -0,0 +1,74 @@
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 512, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (512, 0, 512, 512)
+CONSOLE MESSAGE: MockPageOverlayClient::drawRect dirtyRect (0, 0, 512, 512)
+Initial layers
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+Layers after removal
+
+View-relative:
+(no view-relative overlay root)
+
+Document-relative:
+(no document-relative overlay root)
+Layers after re-insertion
+
+View-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 600.00)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ )
+ )
+)
+
+
+Document-relative:
+(GraphicsLayer
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 5008.00 5016.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (backgroundColor #00000000)
+ (tile cache coverage 0, 0 1024 x 1024)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 2 x 2)
+ (in window 1)
+ )
+ )
+)
+
Modified: trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt (211682 => 211683)
--- trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt 2017-02-05 19:18:16 UTC (rev 211683)
@@ -55,7 +55,7 @@
(tile cache coverage 0, 0 1024 x 1016)
(tile size 512 x 512)
(top left tile 0, 0 tiles grid 2 x 2)
- (in window 0)
+ (in window 1)
(children 1
(GraphicsLayer
(position 8.00 8.00)
Modified: trunk/Source/WebCore/ChangeLog (211682 => 211683)
--- trunk/Source/WebCore/ChangeLog 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/ChangeLog 2017-02-05 19:18:16 UTC (rev 211683)
@@ -1,3 +1,61 @@
+2017-02-04 Simon Fraser <simon.fra...@apple.com>
+
+ Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays
+ https://bugs.webkit.org/show_bug.cgi?id=167850
+
+ Reviewed by Tim Horton.
+
+ RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants() walked the RenderLayer
+ tree to set the GraphicsLayer's "inWindow" state. This had the problem of skipping non-primary
+ GraphicsLayers. We also never did this work for page overlay layers.
+
+ Fix by giving GraphicsLayers a recursive function that sets the inWindow state, and call that
+ from RenderLayerCompositor::setIsInWindow() and PageOverlayController.
+
+ PageOverlayController also needs to implement tiledBackingUsageChanged so that tiled backings
+ created dynamically get the correct in-window state.
+
+ Page overlays also had some serious issues in MiniBrowser, in that they disappeared on reload,
+ and on hide/show web view. This was because the overlay root layers were re-parented, but
+ addChild() for each overlay's layer wasn't called. Clean up by replacing willAttachRootLayer() followed
+ by viewOverlayRootLayer()/documentOverlayRootLayer() with single calls that set up the layers,
+ update the inWindow state, and return the layer.
+
+ Make it possible to dump tile caches in page overlay tests.
+
+ Make showGraphicsLayers() always dump page overlay layers (source of much confusion).
+
+ Test: pageoverlay/overlay-remove-reinsert-view.html
+
+ * page/PageOverlayController.cpp:
+ (WebCore::PageOverlayController::documentOverlayRootLayer):
+ (WebCore::PageOverlayController::viewOverlayRootLayer):
+ (WebCore::PageOverlayController::layerWithDocumentOverlays):
+ (WebCore::PageOverlayController::layerWithViewOverlays):
+ (WebCore::PageOverlayController::tiledBackingUsageChanged):
+ (WebCore::PageOverlayController::willAttachRootLayer): Deleted.
+ * page/PageOverlayController.h:
+ * platform/graphics/GraphicsLayer.cpp:
+ (WebCore::GraphicsLayer::setIsInWindowIncludingDescendants):
+ (WebCore::dumpChildren):
+ * platform/graphics/GraphicsLayer.h:
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::appendDocumentOverlayLayers):
+ (WebCore::RenderLayerCompositor::setIsInWindow):
+ (WebCore::RenderLayerCompositor::attachRootLayer):
+ (WebCore::RenderLayerCompositor::rootLayerAttachmentChanged):
+ (WebCore::RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants): Deleted.
+ * rendering/RenderLayerCompositor.h:
+ * testing/Internals.cpp:
+ (WebCore::toLayerTreeFlags):
+ (WebCore::Internals::layerTreeAsText):
+ (WebCore::Internals::pageOverlayLayerTreeAsText):
+ * testing/Internals.h:
+ * testing/Internals.idl:
+ * testing/MockPageOverlayClient.cpp:
+ (WebCore::MockPageOverlayClient::layerTreeAsText):
+ * testing/MockPageOverlayClient.h:
+
2017-02-05 Zalan Bujtas <za...@apple.com>
Simple line layout: Use RenderText::canUseSimpleFontCodePath() only as a hint.
Modified: trunk/Source/WebCore/page/PageOverlayController.cpp (211682 => 211683)
--- trunk/Source/WebCore/page/PageOverlayController.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/page/PageOverlayController.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -72,16 +72,14 @@
#endif
}
-GraphicsLayer& PageOverlayController::documentOverlayRootLayer()
+GraphicsLayer* PageOverlayController::documentOverlayRootLayer() const
{
- createRootLayersIfNeeded();
- return *m_documentOverlayRootLayer;
+ return m_documentOverlayRootLayer.get();
}
-GraphicsLayer& PageOverlayController::viewOverlayRootLayer()
+GraphicsLayer* PageOverlayController::viewOverlayRootLayer() const
{
- createRootLayersIfNeeded();
- return *m_viewOverlayRootLayer;
+ return m_viewOverlayRootLayer.get();
}
static void updateOverlayGeometry(PageOverlay& overlay, GraphicsLayer& graphicsLayer)
@@ -95,6 +93,50 @@
graphicsLayer.setSize(overlayFrame.size());
}
+GraphicsLayer& PageOverlayController::layerWithDocumentOverlays()
+{
+ createRootLayersIfNeeded();
+
+ bool inWindow = m_mainFrame.page() ? m_mainFrame.page()->isInWindow() : false;
+
+ for (auto& overlayAndLayer : m_overlayGraphicsLayers) {
+ PageOverlay& overlay = *overlayAndLayer.key;
+ if (overlay.overlayType() != PageOverlay::OverlayType::Document)
+ continue;
+
+ GraphicsLayer& layer = *overlayAndLayer.value;
+ layer.setIsInWindowIncludingDescendants(inWindow);
+ updateOverlayGeometry(overlay, layer);
+
+ if (!layer.parent())
+ m_documentOverlayRootLayer->addChild(&layer);
+ }
+
+ return *m_documentOverlayRootLayer;
+}
+
+GraphicsLayer& PageOverlayController::layerWithViewOverlays()
+{
+ createRootLayersIfNeeded();
+
+ bool inWindow = m_mainFrame.page() ? m_mainFrame.page()->isInWindow() : false;
+
+ for (auto& overlayAndLayer : m_overlayGraphicsLayers) {
+ PageOverlay& overlay = *overlayAndLayer.key;
+ if (overlay.overlayType() != PageOverlay::OverlayType::View)
+ continue;
+
+ GraphicsLayer& layer = *overlayAndLayer.value;
+ layer.setIsInWindowIncludingDescendants(inWindow);
+ updateOverlayGeometry(overlay, layer);
+
+ if (!layer.parent())
+ m_viewOverlayRootLayer->addChild(&layer);
+ }
+
+ return *m_viewOverlayRootLayer;
+}
+
void PageOverlayController::installPageOverlay(PageOverlay& overlay, PageOverlay::FadeMode fadeMode)
{
createRootLayersIfNeeded();
@@ -201,12 +243,6 @@
return *m_overlayGraphicsLayers.get(&overlay);
}
-void PageOverlayController::willAttachRootLayer()
-{
- for (auto& overlayAndLayer : m_overlayGraphicsLayers)
- updateOverlayGeometry(*overlayAndLayer.key, *overlayAndLayer.value);
-}
-
void PageOverlayController::willDetachRootLayer()
{
m_documentOverlayRootLayer = nullptr;
@@ -367,4 +403,10 @@
return !(behavior & LayerTreeAsTextIncludePageOverlayLayers);
}
+void PageOverlayController::tiledBackingUsageChanged(const GraphicsLayer* graphicsLayer, bool usingTiledBacking)
+{
+ if (usingTiledBacking)
+ graphicsLayer->tiledBacking()->setIsInWindow(m_mainFrame.page()->isInWindow());
+}
+
} // namespace WebKit
Modified: trunk/Source/WebCore/page/PageOverlayController.h (211682 => 211683)
--- trunk/Source/WebCore/page/PageOverlayController.h 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/page/PageOverlayController.h 2017-02-05 19:18:16 UTC (rev 211683)
@@ -44,9 +44,12 @@
PageOverlayController(MainFrame&);
virtual ~PageOverlayController();
- WEBCORE_EXPORT GraphicsLayer& documentOverlayRootLayer();
- WEBCORE_EXPORT GraphicsLayer& viewOverlayRootLayer();
+ GraphicsLayer& layerWithDocumentOverlays();
+ GraphicsLayer& layerWithViewOverlays();
+ WEBCORE_EXPORT GraphicsLayer* documentOverlayRootLayer() const;
+ WEBCORE_EXPORT GraphicsLayer* viewOverlayRootLayer() const;
+
const Vector<RefPtr<PageOverlay>>& pageOverlays() const { return m_pageOverlays; }
WEBCORE_EXPORT void installPageOverlay(PageOverlay&, PageOverlay::FadeMode);
@@ -57,7 +60,6 @@
void clearPageOverlay(PageOverlay&);
GraphicsLayer& layerForOverlay(PageOverlay&) const;
- void willAttachRootLayer();
void willDetachRootLayer();
void didChangeViewSize();
@@ -89,6 +91,7 @@
void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const FloatRect& clipRect) override;
float deviceScaleFactor() const override;
bool shouldSkipLayerInDump(const GraphicsLayer*, LayerTreeAsTextBehavior) const override;
+ void tiledBackingUsageChanged(const GraphicsLayer*, bool) override;
std::unique_ptr<GraphicsLayer> m_documentOverlayRootLayer;
std::unique_ptr<GraphicsLayer> m_viewOverlayRootLayer;
Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp (211682 => 211683)
--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -364,6 +364,15 @@
childLayers[i]->noteDeviceOrPageScaleFactorChangedIncludingDescendants();
}
+void GraphicsLayer::setIsInWindowIncludingDescendants(bool inWindow)
+{
+ if (usingTiledBacking())
+ tiledBacking()->setIsInWindow(inWindow);
+
+ for (auto* childLayer : children())
+ childLayer->setIsInWindowIncludingDescendants(inWindow);
+}
+
void GraphicsLayer::setReplicatedByLayer(GraphicsLayer* layer)
{
if (m_replicaLayer == layer)
@@ -680,7 +689,7 @@
{
totalChildCount += children.size();
for (auto* child : children) {
- if (!child->client().shouldSkipLayerInDump(child, behavior)) {
+ if ((behavior & LayerTreeAsTextDebug) || !child->client().shouldSkipLayerInDump(child, behavior)) {
child->dumpLayer(ts, indent + 2, behavior);
continue;
}
Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.h (211682 => 211683)
--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.h 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.h 2017-02-05 19:18:16 UTC (rev 211683)
@@ -517,6 +517,8 @@
virtual void deviceOrPageScaleFactorChanged() { }
WEBCORE_EXPORT void noteDeviceOrPageScaleFactorChangedIncludingDescendants();
+ void setIsInWindowIncludingDescendants(bool);
+
// Some compositing systems may do internal batching to synchronize compositing updates
// with updates drawn into the window. These methods flush internal batched state on this layer
// and descendant layers, and this layer only.
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (211682 => 211683)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -777,9 +777,7 @@
return;
Frame& frame = m_renderView.frameView().frame();
- PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController();
- pageOverlayController.willAttachRootLayer();
- childList.append(&pageOverlayController.documentOverlayRootLayer());
+ childList.append(&frame.mainFrame().pageOverlayController().layerWithDocumentOverlays());
}
void RenderLayerCompositor::layerBecameNonComposited(const RenderLayer& layer)
@@ -2027,28 +2025,14 @@
}
#endif
-void RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants(RenderLayer& layer, bool isInWindow)
-{
- if (layer.isComposited()) {
- if (auto* backing = layer.backing()->tiledBacking())
- backing->setIsInWindow(isInWindow);
- }
-
- // No need to recurse if we don't have any other tiled layers.
- if (!hasNonMainLayersWithTiledBacking())
- return;
-
- for (RenderLayer* childLayer = layer.firstChild(); childLayer; childLayer = childLayer->nextSibling())
- setIsInWindowForLayerIncludingDescendants(*childLayer, isInWindow);
-}
-
void RenderLayerCompositor::setIsInWindow(bool isInWindow)
{
- setIsInWindowForLayerIncludingDescendants(*m_renderView.layer(), isInWindow);
-
if (!inCompositingMode())
return;
+ if (GraphicsLayer* rootLayer = rootGraphicsLayer())
+ rootLayer->setIsInWindowIncludingDescendants(isInWindow);
+
if (isInWindow) {
if (m_rootLayerAttachment != RootLayerUnattached)
return;
@@ -3468,11 +3452,8 @@
case RootLayerAttachedViaChromeClient: {
Frame& frame = m_renderView.frameView().frame();
page().chrome().client().attachRootGraphicsLayer(frame, rootGraphicsLayer());
- if (frame.isMainFrame()) {
- PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController();
- pageOverlayController.willAttachRootLayer();
- page().chrome().client().attachViewOverlayGraphicsLayer(frame, &pageOverlayController.viewOverlayRootLayer());
- }
+ if (frame.isMainFrame())
+ page().chrome().client().attachViewOverlayGraphicsLayer(frame, &frame.mainFrame().pageOverlayController().layerWithViewOverlays());
break;
}
case RootLayerAttachedViaEnclosingFrame: {
@@ -3551,9 +3532,7 @@
if (!frame.isMainFrame())
return;
- PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController();
- pageOverlayController.willAttachRootLayer();
- m_rootContentLayer->addChild(&pageOverlayController.documentOverlayRootLayer());
+ m_rootContentLayer->addChild(&frame.mainFrame().pageOverlayController().layerWithDocumentOverlays());
}
void RenderLayerCompositor::notifyIFramesOfCompositingChange()
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (211682 => 211683)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2017-02-05 19:18:16 UTC (rev 211683)
@@ -350,7 +350,6 @@
bool updateBacking(RenderLayer&, CompositingChangeRepaint shouldRepaint, BackingRequired = BackingRequired::Unknown);
void clearBackingForLayerIncludingDescendants(RenderLayer&);
- void setIsInWindowForLayerIncludingDescendants(RenderLayer&, bool isInWindow);
// Repaint this and its child layers.
void recursiveRepaintLayer(RenderLayer&);
Modified: trunk/Source/WebCore/testing/Internals.cpp (211682 => 211683)
--- trunk/Source/WebCore/testing/Internals.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -2016,6 +2016,23 @@
return document->isPageBoxVisible(pageNumber);
}
+static LayerTreeFlags toLayerTreeFlags(unsigned short flags)
+{
+ LayerTreeFlags layerTreeFlags = 0;
+ if (flags & Internals::LAYER_TREE_INCLUDES_VISIBLE_RECTS)
+ layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects;
+ if (flags & Internals::LAYER_TREE_INCLUDES_TILE_CACHES)
+ layerTreeFlags |= LayerTreeFlagsIncludeTileCaches;
+ if (flags & Internals::LAYER_TREE_INCLUDES_REPAINT_RECTS)
+ layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects;
+ if (flags & Internals::LAYER_TREE_INCLUDES_PAINTING_PHASES)
+ layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases;
+ if (flags & Internals::LAYER_TREE_INCLUDES_CONTENT_LAYERS)
+ layerTreeFlags |= LayerTreeFlagsIncludeContentLayers;
+
+ return layerTreeFlags;
+}
+
// FIXME: Remove the document argument. It is almost always the same as
// contextDocument(), with the exception of a few tests that pass a
// different document, and could just make the call through another Internals
@@ -2025,19 +2042,7 @@
if (!document.frame())
return Exception { INVALID_ACCESS_ERR };
- LayerTreeFlags layerTreeFlags = 0;
- if (flags & LAYER_TREE_INCLUDES_VISIBLE_RECTS)
- layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects;
- if (flags & LAYER_TREE_INCLUDES_TILE_CACHES)
- layerTreeFlags |= LayerTreeFlagsIncludeTileCaches;
- if (flags & LAYER_TREE_INCLUDES_REPAINT_RECTS)
- layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects;
- if (flags & LAYER_TREE_INCLUDES_PAINTING_PHASES)
- layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases;
- if (flags & LAYER_TREE_INCLUDES_CONTENT_LAYERS)
- layerTreeFlags |= LayerTreeFlagsIncludeContentLayers;
-
- return document.frame()->layerTreeAsText(layerTreeFlags);
+ return document.frame()->layerTreeAsText(toLayerTreeFlags(flags));
}
ExceptionOr<String> Internals::repaintRectsAsText() const
@@ -3250,7 +3255,7 @@
return MockPageOverlayClient::singleton().installOverlay(document->frame()->mainFrame(), type == PageOverlayType::View ? PageOverlay::OverlayType::View : PageOverlay::OverlayType::Document);
}
-ExceptionOr<String> Internals::pageOverlayLayerTreeAsText() const
+ExceptionOr<String> Internals::pageOverlayLayerTreeAsText(unsigned short flags) const
{
Document* document = contextDocument();
if (!document || !document->frame())
@@ -3258,7 +3263,7 @@
document->updateLayout();
- return MockPageOverlayClient::singleton().layerTreeAsText(document->frame()->mainFrame());
+ return MockPageOverlayClient::singleton().layerTreeAsText(document->frame()->mainFrame(), toLayerTreeFlags(flags));
}
void Internals::setPageMuted(const String& states)
Modified: trunk/Source/WebCore/testing/Internals.h (211682 => 211683)
--- trunk/Source/WebCore/testing/Internals.h 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.h 2017-02-05 19:18:16 UTC (rev 211683)
@@ -465,7 +465,7 @@
enum class PageOverlayType { View, Document };
ExceptionOr<Ref<MockPageOverlay>> installMockPageOverlay(PageOverlayType);
- ExceptionOr<String> pageOverlayLayerTreeAsText() const;
+ ExceptionOr<String> pageOverlayLayerTreeAsText(unsigned short flags) const;
void setPageMuted(const String&);
String pageMediaState();
Modified: trunk/Source/WebCore/testing/Internals.idl (211682 => 211683)
--- trunk/Source/WebCore/testing/Internals.idl 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/Internals.idl 2017-02-05 19:18:16 UTC (rev 211683)
@@ -445,7 +445,7 @@
[Conditional=VIDEO] boolean elementIsBlockingDisplaySleep(HTMLMediaElement element);
[MayThrowException] MockPageOverlay installMockPageOverlay(PageOverlayType type);
- [MayThrowException] DOMString pageOverlayLayerTreeAsText();
+ [MayThrowException] DOMString pageOverlayLayerTreeAsText(optional unsigned short flags = 0);
void setPageMuted(DOMString mutedState);
DOMString pageMediaState();
Modified: trunk/Source/WebCore/testing/MockPageOverlayClient.cpp (211682 => 211683)
--- trunk/Source/WebCore/testing/MockPageOverlayClient.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/MockPageOverlayClient.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -69,9 +69,13 @@
}
}
-String MockPageOverlayClient::layerTreeAsText(MainFrame& mainFrame)
+String MockPageOverlayClient::layerTreeAsText(MainFrame& mainFrame, LayerTreeFlags flags)
{
- return "View-relative:\n" + mainFrame.pageOverlayController().viewOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers) + "\n\nDocument-relative:\n" + mainFrame.pageOverlayController().documentOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers);
+ GraphicsLayer* viewOverlayRoot = mainFrame.pageOverlayController().viewOverlayRootLayer();
+ GraphicsLayer* documentOverlayRoot = mainFrame.pageOverlayController().documentOverlayRootLayer();
+
+ return "View-relative:\n" + (viewOverlayRoot ? viewOverlayRoot->layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : "(no view-relative overlay root)")
+ + "\n\nDocument-relative:\n" + (documentOverlayRoot ? documentOverlayRoot->layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : "(no document-relative overlay root)");
}
void MockPageOverlayClient::willMoveToPage(PageOverlay&, Page*)
Modified: trunk/Source/WebCore/testing/MockPageOverlayClient.h (211682 => 211683)
--- trunk/Source/WebCore/testing/MockPageOverlayClient.h 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Source/WebCore/testing/MockPageOverlayClient.h 2017-02-05 19:18:16 UTC (rev 211683)
@@ -25,6 +25,7 @@
#pragma once
+#include "Frame.h"
#include "MockPageOverlay.h"
#include "PageOverlay.h"
#include <wtf/HashSet.h>
@@ -43,7 +44,7 @@
Ref<MockPageOverlay> installOverlay(MainFrame&, PageOverlay::OverlayType);
void uninstallAllOverlays();
- String layerTreeAsText(MainFrame&);
+ String layerTreeAsText(MainFrame&, LayerTreeFlags);
virtual ~MockPageOverlayClient() { }
Modified: trunk/Tools/ChangeLog (211682 => 211683)
--- trunk/Tools/ChangeLog 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Tools/ChangeLog 2017-02-05 19:18:16 UTC (rev 211683)
@@ -1,3 +1,13 @@
+2017-02-04 Simon Fraser <simon.fra...@apple.com>
+
+ Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays
+ https://bugs.webkit.org/show_bug.cgi?id=167850
+
+ Reviewed by Tim Horton.
+
+ * DumpRenderTree/TestRunner.cpp:
+ (TestRunner::uiScriptDidComplete): Fix an assertion that fires for non-16-bit strings.
+
2017-02-04 Andreas Kling <akl...@apple.com>
Plug some leaks in TestController and UIScriptContext.
Modified: trunk/Tools/DumpRenderTree/TestRunner.cpp (211682 => 211683)
--- trunk/Tools/DumpRenderTree/TestRunner.cpp 2017-02-05 18:01:04 UTC (rev 211682)
+++ trunk/Tools/DumpRenderTree/TestRunner.cpp 2017-02-05 19:18:16 UTC (rev 211683)
@@ -2431,7 +2431,7 @@
void TestRunner::uiScriptDidComplete(const String& result, unsigned callbackID)
{
- JSRetainPtr<JSStringRef> stringRef(Adopt, JSStringCreateWithCharacters(result.characters16(), result.length()));
+ JSRetainPtr<JSStringRef> stringRef(Adopt, JSStringCreateWithUTF8CString(result.utf8().data()));
callUIScriptCallback(callbackID, stringRef.get());
}