Source/WebCore/ChangeLog

 12021-09-06 Simon Fraser <simon.fraser@apple.com>
 2
 3 https://maya.land/monologues page renders incorrectly (filter should create containing block for fixed)
 4 https://bugs.webkit.org/show_bug.cgi?id=221964
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 No new tests (OOPS!).
 9
 10 * rendering/RenderElement.h:
 11 (WebCore::RenderElement::canContainFixedPositionObjects const):
 12 * rendering/RenderLayer.cpp:
 13 (WebCore::RenderLayer::RenderLayer):
 14 (WebCore::RenderLayer::flagsForUpdateLayerPositions):
 15 (WebCore::RenderLayer::updateLayerPositions):
 16 (WebCore::RenderLayer::clippingRootForPainting const):
 17 (WebCore::accumulateOffsetTowardsAncestor):
 18 (WebCore::RenderLayer::calculateClipRects const):
 19 * rendering/RenderLayer.h:
 20 (WebCore::RenderLayer::hasFilteredAncestor const):
 21
1222021-09-06 Simon Fraser <simon.fraser@apple.com>
223
324 Add a temporarily prefixed property for mask-mode, aliased to -webkit-mask-source-type

Source/WebCore/rendering/RenderElement.h

@@inline bool RenderElement::canContainFixedPositionObjects() const
454454{
455455 return isRenderView()
456456 || (isRenderBlock() && hasTransform())
 457 || hasFilter()
457458 // FIXME: will-change should create containing blocks on inline boxes (bug 225035)
458459 || (isRenderBlock() && style().willChange() && style().willChange()->createsContainingBlockForOutOfFlowPositioned())
459460 || isSVGForeignObject()

Source/WebCore/rendering/RenderLayer.cpp

@@RenderLayer::RenderLayer(RenderLayerModelObject& rendererLayerModelObject)
324324 , m_hasCompositedScrollingAncestor(false)
325325 , m_hasTransformedAncestor(false)
326326 , m_has3DTransformedAncestor(false)
 327 , m_hasFilteredAncestor(false)
327328 , m_insideSVGForeignObject(false)
328329 , m_indirectCompositingReason(static_cast<unsigned>(IndirectCompositingReason::None))
329330 , m_viewportConstrainedNotCompositedReason(NoNotCompositedReason)

@@OptionSet<RenderLayer::UpdateLayerPositionsFlag> RenderLayer::flagsForUpdateLaye
895896 if (parent->has3DTransformedAncestor() || (parent->transform() && !parent->transform()->isAffine()))
896897 flags.add(Seen3DTransformedLayer);
897898
 899 if (parent->hasFilteredAncestor() || parent->hasFilter())
 900 flags.add(SeenFilteredLayer);
 901
898902 if (parent->behavesAsFixed() || (parent->renderer().isFixedPositioned() && !parent->hasTransformedAncestor()))
899903 flags.add(SeenFixedLayer);
900904

@@void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, OptionSet
10011005 m_repaintStatus = NeedsNormalRepaint;
10021006 m_hasTransformedAncestor = flags.contains(SeenTransformedLayer);
10031007 m_has3DTransformedAncestor = flags.contains(Seen3DTransformedLayer);
 1008 m_hasFilteredAncestor = flags.contains(SeenFilteredLayer);
10041009 m_behavesAsFixed = flags.contains(SeenFixedLayer);
10051010 setHasCompositedScrollingAncestor(flags.contains(SeenCompositedScrollingLayer));
10061011

@@void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, OptionSet
10181023 if (!transform()->isAffine())
10191024 flags.add(Seen3DTransformedLayer);
10201025 }
 1026
 1027 if (hasFilter())
 1028 flags.add(SeenFilteredLayer);
10211029
10221030 // Fixed inside transform behaves like absolute (per spec).
1023  if (renderer().isFixedPositioned() && !m_hasTransformedAncestor) {
 1031 if (renderer().isFixedPositioned() && !m_hasTransformedAncestor && !m_hasFilteredAncestor) {
10241032 m_behavesAsFixed = true;
10251033 flags.add(SeenFixedLayer);
10261034 }

@@void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, OptionSet
10341042 if (m_scrollableArea)
10351043 m_scrollableArea->updateMarqueePosition();
10361044
 1045 // FIXME: check behavesAsFixed.
10371046 if (renderer().isFixedPositioned() && renderer().settings().acceleratedCompositingForFixedPositionEnabled()) {
10381047 bool intersectsViewport = compositor().fixedLayerIntersectsViewport(*this);
10391048 if (intersectsViewport != m_isFixedIntersectingViewport) {

@@RenderLayer* RenderLayer::clippingRootForPainting() const
20342043
20352044 current = current->paintOrderParent();
20362045 ASSERT(current);
 2046 // FIXME: Maybe include filters.
20372047 if (current->transform() || compositedWithOwnBackingStore(*current))
20382048 return const_cast<RenderLayer*>(current);
20392049

@@static inline const RenderLayer* accumulateOffsetTowardsAncestor(const RenderLay
22622272 // If the fixed renderer is inside a RenderFragmentedFlow, we should not compute location using localToAbsolute,
22632273 // since localToAbsolute maps the coordinates from named flow to regions coordinates and regions can be
22642274 // positioned in a completely different place in the viewport (RenderView).
2265  if (position == PositionType::Fixed && !fixedFragmentedFlowContainer && (!ancestorLayer || ancestorLayer == renderer.view().layer())) {
 2275 if (position == PositionType::Fixed && layer->behavesAsFixed() && !fixedFragmentedFlowContainer && (!ancestorLayer || ancestorLayer == renderer.view().layer())) {
22662276 // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling
22672277 // localToAbsolute() on the RenderView.
22682278 FloatPoint absPos = renderer.localToAbsolute(FloatPoint(), IsFixed);

@@void RenderLayer::calculateClipRects(const ClipRectsContext& clipRectsContext, C
44944504
44954505 // A fixed object is essentially the root of its containing block hierarchy, so when
44964506 // we encounter such an object, we reset our clip rects to the fixedClipRect.
 4507 // FIXME: Check behavesAsFixed.
44974508 if (renderer().isFixedPositioned()) {
44984509 clipRects.setPosClipRect(clipRects.fixedClipRect());
44994510 clipRects.setOverflowClipRect(clipRects.fixedClipRect());

Source/WebCore/rendering/RenderLayer.h

@@public:
739739 bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
740740
741741 bool hasFilter() const { return renderer().hasFilter(); }
 742 bool hasFilteredAncestor() const { return m_hasFilteredAncestor; }
 743
742744 bool hasFilterOutsets() const { return !filterOutsets().isZero(); }
743745 IntOutsets filterOutsets() const;
744746 bool hasBackdropFilter() const

@@private:
941943 UpdatePagination = 1 << 3,
942944 SeenFixedLayer = 1 << 4,
943945 SeenTransformedLayer = 1 << 5,
944  Seen3DTransformedLayer = 1 << 6,
945  SeenCompositedScrollingLayer = 1 << 7,
 946 SeenFilteredLayer = 1 << 6,
 947 Seen3DTransformedLayer = 1 << 7,
 948 SeenCompositedScrollingLayer = 1 << 8,
946949 };
947950 static OptionSet<UpdateLayerPositionsFlag> flagsForUpdateLayerPositions(RenderLayer& startingLayer);
948951

@@private:
11341137 bool m_hasTransformedAncestor : 1;
11351138 bool m_has3DTransformedAncestor : 1;
11361139
 1140 bool m_hasFilteredAncestor : 1;
 1141
11371142 bool m_insideSVGForeignObject : 1;
11381143
11391144 unsigned m_indirectCompositingReason : 4; // IndirectCompositingReason