Changeset 211683 in webkit
- Timestamp:
- Feb 5, 2017, 11:18:16 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r211682 r211683 1 2017-02-04 Simon Fraser <simon.fraser@apple.com> 2 3 Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays 4 https://bugs.webkit.org/show_bug.cgi?id=167850 5 6 Reviewed by Tim Horton. 7 8 * pageoverlay/overlay-large-document-expected.txt: 9 * pageoverlay/overlay-large-document-scrolled-expected.txt: 10 * pageoverlay/overlay-remove-reinsert-view-expected.txt: Added. 11 * pageoverlay/overlay-remove-reinsert-view.html: Added. 12 * platform/ios-simulator-wk2/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added. 13 * platform/mac-wk1/pageoverlay/overlay-remove-reinsert-view-expected.txt: Added. 14 * tiled-drawing/tiled-backing-in-window-expected.txt: 15 1 16 2017-02-05 Zalan Bujtas <zalan@apple.com> 2 17 -
trunk/LayoutTests/pageoverlay/overlay-large-document-expected.txt
r194117 r211683 9 9 (GraphicsLayer 10 10 (anchor 0.00 0.00) 11 (bounds 785.00 585.00)11 (bounds 800.00 600.00) 12 12 (drawsContent 1) 13 13 (backgroundColor #00000000) -
trunk/LayoutTests/pageoverlay/overlay-large-document-scrolled-expected.txt
r194117 r211683 9 9 (GraphicsLayer 10 10 (anchor 0.00 0.00) 11 (bounds 785.00 585.00)11 (bounds 800.00 600.00) 12 12 (drawsContent 1) 13 13 (backgroundColor #00000000) -
trunk/LayoutTests/platform/mac-wk1/TestExpectations
r211561 r211683 306 306 307 307 webkit.org/b/167127 pointer-lock/locked-element-removed-from-dom.html 308 309 webkit.org/b/167857 pageoverlay/overlay-remove-reinsert-view.html [ Skip ] -
trunk/LayoutTests/tiled-drawing/tiled-backing-in-window-expected.txt
r211662 r211683 56 56 (tile size 512 x 512) 57 57 (top left tile 0, 0 tiles grid 2 x 2) 58 (in window 0)58 (in window 1) 59 59 (children 1 60 60 (GraphicsLayer -
trunk/Source/WebCore/ChangeLog
r211682 r211683 1 2017-02-04 Simon Fraser <simon.fraser@apple.com> 2 3 Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays 4 https://bugs.webkit.org/show_bug.cgi?id=167850 5 6 Reviewed by Tim Horton. 7 8 RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants() walked the RenderLayer 9 tree to set the GraphicsLayer's "inWindow" state. This had the problem of skipping non-primary 10 GraphicsLayers. We also never did this work for page overlay layers. 11 12 Fix by giving GraphicsLayers a recursive function that sets the inWindow state, and call that 13 from RenderLayerCompositor::setIsInWindow() and PageOverlayController. 14 15 PageOverlayController also needs to implement tiledBackingUsageChanged so that tiled backings 16 created dynamically get the correct in-window state. 17 18 Page overlays also had some serious issues in MiniBrowser, in that they disappeared on reload, 19 and on hide/show web view. This was because the overlay root layers were re-parented, but 20 addChild() for each overlay's layer wasn't called. Clean up by replacing willAttachRootLayer() followed 21 by viewOverlayRootLayer()/documentOverlayRootLayer() with single calls that set up the layers, 22 update the inWindow state, and return the layer. 23 24 Make it possible to dump tile caches in page overlay tests. 25 26 Make showGraphicsLayers() always dump page overlay layers (source of much confusion). 27 28 Test: pageoverlay/overlay-remove-reinsert-view.html 29 30 * page/PageOverlayController.cpp: 31 (WebCore::PageOverlayController::documentOverlayRootLayer): 32 (WebCore::PageOverlayController::viewOverlayRootLayer): 33 (WebCore::PageOverlayController::layerWithDocumentOverlays): 34 (WebCore::PageOverlayController::layerWithViewOverlays): 35 (WebCore::PageOverlayController::tiledBackingUsageChanged): 36 (WebCore::PageOverlayController::willAttachRootLayer): Deleted. 37 * page/PageOverlayController.h: 38 * platform/graphics/GraphicsLayer.cpp: 39 (WebCore::GraphicsLayer::setIsInWindowIncludingDescendants): 40 (WebCore::dumpChildren): 41 * platform/graphics/GraphicsLayer.h: 42 * rendering/RenderLayerCompositor.cpp: 43 (WebCore::RenderLayerCompositor::appendDocumentOverlayLayers): 44 (WebCore::RenderLayerCompositor::setIsInWindow): 45 (WebCore::RenderLayerCompositor::attachRootLayer): 46 (WebCore::RenderLayerCompositor::rootLayerAttachmentChanged): 47 (WebCore::RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants): Deleted. 48 * rendering/RenderLayerCompositor.h: 49 * testing/Internals.cpp: 50 (WebCore::toLayerTreeFlags): 51 (WebCore::Internals::layerTreeAsText): 52 (WebCore::Internals::pageOverlayLayerTreeAsText): 53 * testing/Internals.h: 54 * testing/Internals.idl: 55 * testing/MockPageOverlayClient.cpp: 56 (WebCore::MockPageOverlayClient::layerTreeAsText): 57 * testing/MockPageOverlayClient.h: 58 1 59 2017-02-05 Zalan Bujtas <zalan@apple.com> 2 60 -
trunk/Source/WebCore/page/PageOverlayController.cpp
r211141 r211683 73 73 } 74 74 75 GraphicsLayer& PageOverlayController::documentOverlayRootLayer() 76 { 77 createRootLayersIfNeeded(); 78 return *m_documentOverlayRootLayer; 79 } 80 81 GraphicsLayer& PageOverlayController::viewOverlayRootLayer() 82 { 83 createRootLayersIfNeeded(); 84 return *m_viewOverlayRootLayer; 75 GraphicsLayer* PageOverlayController::documentOverlayRootLayer() const 76 { 77 return m_documentOverlayRootLayer.get(); 78 } 79 80 GraphicsLayer* PageOverlayController::viewOverlayRootLayer() const 81 { 82 return m_viewOverlayRootLayer.get(); 85 83 } 86 84 … … 94 92 graphicsLayer.setPosition(overlayFrame.location()); 95 93 graphicsLayer.setSize(overlayFrame.size()); 94 } 95 96 GraphicsLayer& PageOverlayController::layerWithDocumentOverlays() 97 { 98 createRootLayersIfNeeded(); 99 100 bool inWindow = m_mainFrame.page() ? m_mainFrame.page()->isInWindow() : false; 101 102 for (auto& overlayAndLayer : m_overlayGraphicsLayers) { 103 PageOverlay& overlay = *overlayAndLayer.key; 104 if (overlay.overlayType() != PageOverlay::OverlayType::Document) 105 continue; 106 107 GraphicsLayer& layer = *overlayAndLayer.value; 108 layer.setIsInWindowIncludingDescendants(inWindow); 109 updateOverlayGeometry(overlay, layer); 110 111 if (!layer.parent()) 112 m_documentOverlayRootLayer->addChild(&layer); 113 } 114 115 return *m_documentOverlayRootLayer; 116 } 117 118 GraphicsLayer& PageOverlayController::layerWithViewOverlays() 119 { 120 createRootLayersIfNeeded(); 121 122 bool inWindow = m_mainFrame.page() ? m_mainFrame.page()->isInWindow() : false; 123 124 for (auto& overlayAndLayer : m_overlayGraphicsLayers) { 125 PageOverlay& overlay = *overlayAndLayer.key; 126 if (overlay.overlayType() != PageOverlay::OverlayType::View) 127 continue; 128 129 GraphicsLayer& layer = *overlayAndLayer.value; 130 layer.setIsInWindowIncludingDescendants(inWindow); 131 updateOverlayGeometry(overlay, layer); 132 133 if (!layer.parent()) 134 m_viewOverlayRootLayer->addChild(&layer); 135 } 136 137 return *m_viewOverlayRootLayer; 96 138 } 97 139 … … 202 244 } 203 245 204 void PageOverlayController::willAttachRootLayer()205 {206 for (auto& overlayAndLayer : m_overlayGraphicsLayers)207 updateOverlayGeometry(*overlayAndLayer.key, *overlayAndLayer.value);208 }209 210 246 void PageOverlayController::willDetachRootLayer() 211 247 { … … 368 404 } 369 405 406 void PageOverlayController::tiledBackingUsageChanged(const GraphicsLayer* graphicsLayer, bool usingTiledBacking) 407 { 408 if (usingTiledBacking) 409 graphicsLayer->tiledBacking()->setIsInWindow(m_mainFrame.page()->isInWindow()); 410 } 411 370 412 } // namespace WebKit -
trunk/Source/WebCore/page/PageOverlayController.h
r211141 r211683 45 45 virtual ~PageOverlayController(); 46 46 47 WEBCORE_EXPORT GraphicsLayer& documentOverlayRootLayer(); 48 WEBCORE_EXPORT GraphicsLayer& viewOverlayRootLayer(); 47 GraphicsLayer& layerWithDocumentOverlays(); 48 GraphicsLayer& layerWithViewOverlays(); 49 50 WEBCORE_EXPORT GraphicsLayer* documentOverlayRootLayer() const; 51 WEBCORE_EXPORT GraphicsLayer* viewOverlayRootLayer() const; 49 52 50 53 const Vector<RefPtr<PageOverlay>>& pageOverlays() const { return m_pageOverlays; } … … 58 61 GraphicsLayer& layerForOverlay(PageOverlay&) const; 59 62 60 void willAttachRootLayer();61 63 void willDetachRootLayer(); 62 64 … … 90 92 float deviceScaleFactor() const override; 91 93 bool shouldSkipLayerInDump(const GraphicsLayer*, LayerTreeAsTextBehavior) const override; 94 void tiledBackingUsageChanged(const GraphicsLayer*, bool) override; 92 95 93 96 std::unique_ptr<GraphicsLayer> m_documentOverlayRootLayer; -
trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp
r209224 r211683 363 363 for (size_t i = 0; i < numChildren; ++i) 364 364 childLayers[i]->noteDeviceOrPageScaleFactorChangedIncludingDescendants(); 365 } 366 367 void GraphicsLayer::setIsInWindowIncludingDescendants(bool inWindow) 368 { 369 if (usingTiledBacking()) 370 tiledBacking()->setIsInWindow(inWindow); 371 372 for (auto* childLayer : children()) 373 childLayer->setIsInWindowIncludingDescendants(inWindow); 365 374 } 366 375 … … 681 690 totalChildCount += children.size(); 682 691 for (auto* child : children) { 683 if ( !child->client().shouldSkipLayerInDump(child, behavior)) {692 if ((behavior & LayerTreeAsTextDebug) || !child->client().shouldSkipLayerInDump(child, behavior)) { 684 693 child->dumpLayer(ts, indent + 2, behavior); 685 694 continue; -
trunk/Source/WebCore/platform/graphics/GraphicsLayer.h
r210758 r211683 518 518 WEBCORE_EXPORT void noteDeviceOrPageScaleFactorChangedIncludingDescendants(); 519 519 520 void setIsInWindowIncludingDescendants(bool); 521 520 522 // Some compositing systems may do internal batching to synchronize compositing updates 521 523 // with updates drawn into the window. These methods flush internal batched state on this layer -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r211662 r211683 778 778 779 779 Frame& frame = m_renderView.frameView().frame(); 780 PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController(); 781 pageOverlayController.willAttachRootLayer(); 782 childList.append(&pageOverlayController.documentOverlayRootLayer()); 780 childList.append(&frame.mainFrame().pageOverlayController().layerWithDocumentOverlays()); 783 781 } 784 782 … … 2028 2026 #endif 2029 2027 2030 void RenderLayerCompositor::setIsInWindowForLayerIncludingDescendants(RenderLayer& layer, bool isInWindow)2031 {2032 if (layer.isComposited()) {2033 if (auto* backing = layer.backing()->tiledBacking())2034 backing->setIsInWindow(isInWindow);2035 }2036 2037 // No need to recurse if we don't have any other tiled layers.2038 if (!hasNonMainLayersWithTiledBacking())2039 return;2040 2041 for (RenderLayer* childLayer = layer.firstChild(); childLayer; childLayer = childLayer->nextSibling())2042 setIsInWindowForLayerIncludingDescendants(*childLayer, isInWindow);2043 }2044 2045 2028 void RenderLayerCompositor::setIsInWindow(bool isInWindow) 2046 2029 { 2047 setIsInWindowForLayerIncludingDescendants(*m_renderView.layer(), isInWindow);2048 2049 2030 if (!inCompositingMode()) 2050 2031 return; 2032 2033 if (GraphicsLayer* rootLayer = rootGraphicsLayer()) 2034 rootLayer->setIsInWindowIncludingDescendants(isInWindow); 2051 2035 2052 2036 if (isInWindow) { … … 3469 3453 Frame& frame = m_renderView.frameView().frame(); 3470 3454 page().chrome().client().attachRootGraphicsLayer(frame, rootGraphicsLayer()); 3471 if (frame.isMainFrame()) { 3472 PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController(); 3473 pageOverlayController.willAttachRootLayer(); 3474 page().chrome().client().attachViewOverlayGraphicsLayer(frame, &pageOverlayController.viewOverlayRootLayer()); 3475 } 3455 if (frame.isMainFrame()) 3456 page().chrome().client().attachViewOverlayGraphicsLayer(frame, &frame.mainFrame().pageOverlayController().layerWithViewOverlays()); 3476 3457 break; 3477 3458 } … … 3552 3533 return; 3553 3534 3554 PageOverlayController& pageOverlayController = frame.mainFrame().pageOverlayController(); 3555 pageOverlayController.willAttachRootLayer(); 3556 m_rootContentLayer->addChild(&pageOverlayController.documentOverlayRootLayer()); 3535 m_rootContentLayer->addChild(&frame.mainFrame().pageOverlayController().layerWithDocumentOverlays()); 3557 3536 } 3558 3537 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r210436 r211683 351 351 352 352 void clearBackingForLayerIncludingDescendants(RenderLayer&); 353 void setIsInWindowForLayerIncludingDescendants(RenderLayer&, bool isInWindow);354 353 355 354 // Repaint this and its child layers. -
trunk/Source/WebCore/testing/Internals.cpp
r211612 r211683 2017 2017 } 2018 2018 2019 static LayerTreeFlags toLayerTreeFlags(unsigned short flags) 2020 { 2021 LayerTreeFlags layerTreeFlags = 0; 2022 if (flags & Internals::LAYER_TREE_INCLUDES_VISIBLE_RECTS) 2023 layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects; 2024 if (flags & Internals::LAYER_TREE_INCLUDES_TILE_CACHES) 2025 layerTreeFlags |= LayerTreeFlagsIncludeTileCaches; 2026 if (flags & Internals::LAYER_TREE_INCLUDES_REPAINT_RECTS) 2027 layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects; 2028 if (flags & Internals::LAYER_TREE_INCLUDES_PAINTING_PHASES) 2029 layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases; 2030 if (flags & Internals::LAYER_TREE_INCLUDES_CONTENT_LAYERS) 2031 layerTreeFlags |= LayerTreeFlagsIncludeContentLayers; 2032 2033 return layerTreeFlags; 2034 } 2035 2019 2036 // FIXME: Remove the document argument. It is almost always the same as 2020 2037 // contextDocument(), with the exception of a few tests that pass a … … 2026 2043 return Exception { INVALID_ACCESS_ERR }; 2027 2044 2028 LayerTreeFlags layerTreeFlags = 0; 2029 if (flags & LAYER_TREE_INCLUDES_VISIBLE_RECTS) 2030 layerTreeFlags |= LayerTreeFlagsIncludeVisibleRects; 2031 if (flags & LAYER_TREE_INCLUDES_TILE_CACHES) 2032 layerTreeFlags |= LayerTreeFlagsIncludeTileCaches; 2033 if (flags & LAYER_TREE_INCLUDES_REPAINT_RECTS) 2034 layerTreeFlags |= LayerTreeFlagsIncludeRepaintRects; 2035 if (flags & LAYER_TREE_INCLUDES_PAINTING_PHASES) 2036 layerTreeFlags |= LayerTreeFlagsIncludePaintingPhases; 2037 if (flags & LAYER_TREE_INCLUDES_CONTENT_LAYERS) 2038 layerTreeFlags |= LayerTreeFlagsIncludeContentLayers; 2039 2040 return document.frame()->layerTreeAsText(layerTreeFlags); 2045 return document.frame()->layerTreeAsText(toLayerTreeFlags(flags)); 2041 2046 } 2042 2047 … … 3251 3256 } 3252 3257 3253 ExceptionOr<String> Internals::pageOverlayLayerTreeAsText( ) const3258 ExceptionOr<String> Internals::pageOverlayLayerTreeAsText(unsigned short flags) const 3254 3259 { 3255 3260 Document* document = contextDocument(); … … 3259 3264 document->updateLayout(); 3260 3265 3261 return MockPageOverlayClient::singleton().layerTreeAsText(document->frame()->mainFrame() );3266 return MockPageOverlayClient::singleton().layerTreeAsText(document->frame()->mainFrame(), toLayerTreeFlags(flags)); 3262 3267 } 3263 3268 -
trunk/Source/WebCore/testing/Internals.h
r211612 r211683 466 466 enum class PageOverlayType { View, Document }; 467 467 ExceptionOr<Ref<MockPageOverlay>> installMockPageOverlay(PageOverlayType); 468 ExceptionOr<String> pageOverlayLayerTreeAsText( ) const;468 ExceptionOr<String> pageOverlayLayerTreeAsText(unsigned short flags) const; 469 469 470 470 void setPageMuted(const String&); -
trunk/Source/WebCore/testing/Internals.idl
r211612 r211683 446 446 447 447 [MayThrowException] MockPageOverlay installMockPageOverlay(PageOverlayType type); 448 [MayThrowException] DOMString pageOverlayLayerTreeAsText( );448 [MayThrowException] DOMString pageOverlayLayerTreeAsText(optional unsigned short flags = 0); 449 449 450 450 void setPageMuted(DOMString mutedState); -
trunk/Source/WebCore/testing/MockPageOverlayClient.cpp
r211033 r211683 70 70 } 71 71 72 String MockPageOverlayClient::layerTreeAsText(MainFrame& mainFrame )72 String MockPageOverlayClient::layerTreeAsText(MainFrame& mainFrame, LayerTreeFlags flags) 73 73 { 74 return "View-relative:\n" + mainFrame.pageOverlayController().viewOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers) + "\n\nDocument-relative:\n" + mainFrame.pageOverlayController().documentOverlayRootLayer().layerTreeAsText(LayerTreeAsTextIncludePageOverlayLayers); 74 GraphicsLayer* viewOverlayRoot = mainFrame.pageOverlayController().viewOverlayRootLayer(); 75 GraphicsLayer* documentOverlayRoot = mainFrame.pageOverlayController().documentOverlayRootLayer(); 76 77 return "View-relative:\n" + (viewOverlayRoot ? viewOverlayRoot->layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : "(no view-relative overlay root)") 78 + "\n\nDocument-relative:\n" + (documentOverlayRoot ? documentOverlayRoot->layerTreeAsText(flags | LayerTreeAsTextIncludePageOverlayLayers) : "(no document-relative overlay root)"); 75 79 } 76 80 -
trunk/Source/WebCore/testing/MockPageOverlayClient.h
r208668 r211683 26 26 #pragma once 27 27 28 #include "Frame.h" 28 29 #include "MockPageOverlay.h" 29 30 #include "PageOverlay.h" … … 44 45 void uninstallAllOverlays(); 45 46 46 String layerTreeAsText(MainFrame& );47 String layerTreeAsText(MainFrame&, LayerTreeFlags); 47 48 48 49 virtual ~MockPageOverlayClient() { } -
trunk/Tools/ChangeLog
r211674 r211683 1 2017-02-04 Simon Fraser <simon.fraser@apple.com> 2 3 Clean up how GraphicsLayer's "inWindow" state is set, and fix some issues with Page Overlays 4 https://bugs.webkit.org/show_bug.cgi?id=167850 5 6 Reviewed by Tim Horton. 7 8 * DumpRenderTree/TestRunner.cpp: 9 (TestRunner::uiScriptDidComplete): Fix an assertion that fires for non-16-bit strings. 10 1 11 2017-02-04 Andreas Kling <akling@apple.com> 2 12 -
trunk/Tools/DumpRenderTree/TestRunner.cpp
r211460 r211683 2432 2432 void TestRunner::uiScriptDidComplete(const String& result, unsigned callbackID) 2433 2433 { 2434 JSRetainPtr<JSStringRef> stringRef(Adopt, JSStringCreateWith Characters(result.characters16(), result.length()));2434 JSRetainPtr<JSStringRef> stringRef(Adopt, JSStringCreateWithUTF8CString(result.utf8().data())); 2435 2435 callUIScriptCallback(callbackID, stringRef.get()); 2436 2436 }
Note:
See TracChangeset
for help on using the changeset viewer.