Changeset 252935 in webkit
- Timestamp:
- Nov 28, 2019 10:27:49 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r252934 r252935 1 2019-11-28 Simon Fraser <simon.fraser@apple.com> 2 3 Element jumps to wrong position after perspective change on ancestor 4 https://bugs.webkit.org/show_bug.cgi?id=202505 5 <rdar://problem/55930710> 6 7 Reviewed by Antti Koivisto. 8 9 * compositing/geometry/layer-position-after-removing-perspective-expected.html: Added. 10 * compositing/geometry/layer-position-after-removing-perspective.html: Added. 11 * css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt: Rebaselined. 12 1 13 2019-11-28 Jonathan Bedard <jbedard@apple.com> 2 14 -
trunk/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt
r236632 r252935 12 12 13 13 (repaint rects 14 (rect 48 54 60 60)15 14 (rect 48 54 60 60) 16 15 (rect 48 54 60 60) … … 30 29 (rect 28 290 60 60) 31 30 (rect 48 644 60 60) 31 (rect 48 54 60 60) 32 32 (rect 48 290 60 60) 33 33 (rect 28 526 60 60) -
trunk/LayoutTests/platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt
r236692 r252935 12 12 13 13 (repaint rects 14 (rect 48 56 60 60)15 14 (rect 48 56 60 60) 16 15 (rect 48 56 60 60) … … 30 29 (rect 28 296 60 60) 31 30 (rect 48 656 60 60) 31 (rect 48 56 60 60) 32 32 (rect 48 296 60 60) 33 33 (rect 28 536 60 60) -
trunk/Source/WebCore/ChangeLog
r252932 r252935 1 2019-11-28 Simon Fraser <simon.fraser@apple.com> 2 3 Element jumps to wrong position after perspective change on ancestor 4 https://bugs.webkit.org/show_bug.cgi?id=202505 5 <rdar://problem/55930710> 6 7 Reviewed by Antti Koivisto. 8 9 This modifies the fix in r252879 to be better-performing and to avoid a new call site for updateLayerPositions*. 10 11 Style can change in a way that creates or destroys RenderLayers, but does not result in a layout; this can happen 12 with changes of properties like opacity or perspective. When this happens, something needs to trigger a call to 13 RenderLayer::updateLayerPositions() on the root of the changed subtree. This is best done after the style update, 14 to avoid multiple updateLayerPositions traversals. 15 16 Implement this by storing on RenderView the rootmost changed layer, and having FrameView::styleDidChange() 17 call updateLayerPositionsAfterStyleChange() if we're after a style change with no pending layout. 18 19 Test: compositing/geometry/layer-position-after-removing-perspective.html 20 21 * page/FrameView.cpp: 22 (WebCore::FrameView::styleDidChange): 23 * page/FrameView.h: 24 * platform/ScrollView.h: 25 * rendering/RenderElement.cpp: 26 (WebCore::RenderElement::didAttachChild): 27 * rendering/RenderLayer.cpp: 28 (WebCore::RenderLayer::insertOnlyThisLayer): 29 (WebCore::RenderLayer::removeOnlyThisLayer): 30 (WebCore::findCommonAncestor): 31 (WebCore::RenderLayer::commonAncestorWithLayer const): 32 * rendering/RenderLayer.h: 33 * rendering/RenderLayerModelObject.cpp: 34 (WebCore::RenderLayerModelObject::createLayer): 35 (WebCore::RenderLayerModelObject::styleDidChange): 36 * rendering/RenderView.cpp: 37 (WebCore::RenderView::layerChildrenChangedDuringStyleChange): 38 (WebCore::RenderView::takeStyleChangeLayerTreeMutationRoot): 39 * rendering/RenderView.h: 40 1 41 2019-11-28 Antti Koivisto <antti@apple.com> 2 42 -
trunk/Source/WebCore/page/FrameView.cpp
r252761 r252935 800 800 } 801 801 802 void FrameView::styleDidChange() 803 { 804 ScrollView::styleDidChange(); 805 RenderView* renderView = this->renderView(); 806 if (!renderView) 807 return; 808 809 RenderLayer* layerTreeMutationRoot = renderView->takeStyleChangeLayerTreeMutationRoot(); 810 if (layerTreeMutationRoot && !needsLayout()) 811 layerTreeMutationRoot->updateLayerPositionsAfterStyleChange(); 812 } 813 802 814 bool FrameView::updateCompositingLayersAfterStyleChange() 803 815 { -
trunk/Source/WebCore/page/FrameView.h
r252761 r252935 139 139 140 140 void willRecalcStyle(); 141 void styleDidChange() override; 141 142 bool updateCompositingLayersAfterStyleChange(); 142 143 void updateCompositingLayersAfterLayout(); -
trunk/Source/WebCore/platform/ScrollView.h
r246488 r252935 141 141 virtual Ref<Scrollbar> createScrollbar(ScrollbarOrientation); 142 142 143 v oid styleDidChange();143 virtual void styleDidChange(); 144 144 145 145 // If the prohibits scrolling flag is set, then all scrolling in the view (even programmatic scrolling) is turned off. -
trunk/Source/WebCore/rendering/RenderElement.cpp
r252724 r252935 471 471 // and stop creating layers at all for these cases - they're not used anyways. 472 472 if (child.hasLayer() && !layerCreationAllowedForSubtree()) 473 downcast<RenderLayerModelObject>(child).layer()->removeOnlyThisLayer( );473 downcast<RenderLayerModelObject>(child).layer()->removeOnlyThisLayer(RenderLayer::LayerChangeTiming::RenderTreeConstruction); 474 474 } 475 475 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r252724 r252935 497 497 } 498 498 499 void RenderLayer::insertOnlyThisLayer( )499 void RenderLayer::insertOnlyThisLayer(LayerChangeTiming timing) 500 500 { 501 501 if (!m_parent && renderer().parent()) { … … 512 512 child.moveLayers(m_parent, this); 513 513 514 if (parent()) { 515 if (timing == LayerChangeTiming::StyleChange) 516 renderer().view().layerChildrenChangedDuringStyleChange(*parent()); 517 } 518 514 519 // Clear out all the clip rects. 515 520 clearClipRectsIncludingDescendants(); 516 521 } 517 522 518 void RenderLayer::removeOnlyThisLayer( )523 void RenderLayer::removeOnlyThisLayer(LayerChangeTiming timing) 519 524 { 520 525 if (!m_parent) 521 526 return; 527 528 if (timing == LayerChangeTiming::StyleChange) 529 renderer().view().layerChildrenChangedDuringStyleChange(*parent()); 522 530 523 531 // Mark that we are about to lose our layer. This makes render tree … … 2249 2257 } 2250 2258 return false; 2259 } 2260 2261 static RenderLayer* findCommonAncestor(const RenderLayer& firstLayer, const RenderLayer& secondLayer) 2262 { 2263 if (&firstLayer == &secondLayer) 2264 return const_cast<RenderLayer*>(&firstLayer); 2265 2266 HashSet<const RenderLayer*> ancestorChain; 2267 for (auto* currLayer = &firstLayer; currLayer; currLayer = currLayer->parent()) 2268 ancestorChain.add(currLayer); 2269 2270 for (auto* currLayer = &secondLayer; currLayer; currLayer = currLayer->parent()) { 2271 if (ancestorChain.contains(currLayer)) 2272 return const_cast<RenderLayer*>(currLayer); 2273 } 2274 return nullptr; 2275 } 2276 2277 RenderLayer* RenderLayer::commonAncestorWithLayer(const RenderLayer& layer) const 2278 { 2279 return findCommonAncestor(*this, layer); 2251 2280 } 2252 2281 -
trunk/Source/WebCore/rendering/RenderLayer.h
r252724 r252935 164 164 RenderLayer* lastChild() const { return m_last; } 165 165 bool isDescendantOf(const RenderLayer&) const; 166 RenderLayer* commonAncestorWithLayer(const RenderLayer&) const; 166 167 167 168 // This does an ancestor tree walk. Avoid it! … … 177 178 void removeChild(RenderLayer&); 178 179 179 void insertOnlyThisLayer(); 180 void removeOnlyThisLayer(); 180 enum class LayerChangeTiming { 181 StyleChange, 182 RenderTreeConstruction, 183 }; 184 void insertOnlyThisLayer(LayerChangeTiming); 185 void removeOnlyThisLayer(LayerChangeTiming); 181 186 182 187 bool isNormalFlowOnly() const { return m_isNormalFlowOnly; } -
trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp
r252879 r252935 98 98 m_layer = makeUnique<RenderLayer>(*this); 99 99 setHasLayer(true); 100 m_layer->insertOnlyThisLayer( );100 m_layer->insertOnlyThisLayer(RenderLayer::LayerChangeTiming::StyleChange); 101 101 } 102 102 … … 170 170 setChildNeedsLayout(); 171 171 createLayer(); 172 if (parent() && !needsLayout() && containingBlock()) {172 if (parent() && !needsLayout() && containingBlock()) 173 173 layer()->setRepaintStatus(NeedsFullRepaint); 174 layer()->updateLayerPositionsAfterStyleChange();175 }176 174 } 177 175 } else if (layer() && layer()->parent()) { … … 180 178 layer()->willRemoveChildWithBlendMode(); 181 179 #endif 182 setHasTransformRelatedProperty(false); // All transform-related prope ties force layers, so we know we don't have one or the object doesn't support them.180 setHasTransformRelatedProperty(false); // All transform-related properties force layers, so we know we don't have one or the object doesn't support them. 183 181 setHasReflection(false); 184 182 // Repaint the about to be destroyed self-painting layer when style change also triggers repaint. 185 183 if (layer()->isSelfPaintingLayer() && layer()->repaintStatus() == NeedsFullRepaint && hasRepaintLayoutRects()) 186 184 repaintUsingContainer(containerForRepaint(), repaintLayoutRects().m_repaintRect); 187 // If the layer we're about to destroy had a position, then the positions of the current children will no longer be correct. 188 auto* parentLayer = layer()->parent(); 189 bool layerHadLocation = !layer()->location().isZero(); 190 layer()->removeOnlyThisLayer(); // calls destroyLayer() which clears m_layer 191 if (layerHadLocation && parentLayer && !parentLayer->renderer().needsLayout()) 192 parentLayer->updateLayerPositionsAfterStyleChange(); 185 186 layer()->removeOnlyThisLayer(RenderLayer::LayerChangeTiming::StyleChange); // calls destroyLayer() which clears m_layer 193 187 if (s_wasFloating && isFloating()) 194 188 setChildNeedsLayout(); -
trunk/Source/WebCore/rendering/RenderView.cpp
r249222 r252935 878 878 } 879 879 880 void RenderView::layerChildrenChangedDuringStyleChange(RenderLayer& layer) 881 { 882 if (!m_styleChangeLayerMutationRoot) { 883 m_styleChangeLayerMutationRoot = makeWeakPtr(layer); 884 return; 885 } 886 887 RenderLayer* commonAncestor = m_styleChangeLayerMutationRoot->commonAncestorWithLayer(layer); 888 m_styleChangeLayerMutationRoot = makeWeakPtr(commonAncestor); 889 } 890 891 RenderLayer* RenderView::takeStyleChangeLayerTreeMutationRoot() 892 { 893 auto* result = m_styleChangeLayerMutationRoot.get(); 894 m_styleChangeLayerMutationRoot.clear(); 895 return result; 896 } 897 880 898 #if ENABLE(CSS_SCROLL_SNAP) 881 899 void RenderView::registerBoxWithScrollSnapPositions(const RenderBox& box) -
trunk/Source/WebCore/rendering/RenderView.h
r249309 r252935 185 185 void scheduleLazyRepaint(RenderBox&); 186 186 void unscheduleLazyRepaint(RenderBox&); 187 188 void layerChildrenChangedDuringStyleChange(RenderLayer&); 189 RenderLayer* takeStyleChangeLayerTreeMutationRoot(); 187 190 188 191 void protectRenderWidgetUntilLayoutIsDone(RenderWidget& widget) { m_protectedRenderWidgets.append(&widget); } … … 219 222 mutable std::unique_ptr<Region> m_accumulatedRepaintRegion; 220 223 SelectionRangeData m_selection; 224 225 WeakPtr<RenderLayer> m_styleChangeLayerMutationRoot; 221 226 222 227 // FIXME: Only used by embedded WebViews inside AppKit NSViews. Find a way to remove.
Note: See TracChangeset
for help on using the changeset viewer.