diff options
Diffstat (limited to 'layout/base/nsLayoutUtils.cpp')
-rw-r--r-- | layout/base/nsLayoutUtils.cpp | 141 |
1 files changed, 66 insertions, 75 deletions
diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index db766f6603..3f84a97250 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -714,12 +714,9 @@ bool nsLayoutUtils::AllowZoomingForDocument( return false; } // True if we allow zooming for all documents on this platform, or if we are - // in RDM and handling meta viewports, which force zoom under some - // circumstances. - BrowsingContext* bc = aDocument ? aDocument->GetBrowsingContext() : nullptr; - return StaticPrefs::apz_allow_zooming() || - (bc && bc->InRDMPane() && - nsLayoutUtils::ShouldHandleMetaViewport(aDocument)); + // in RDM. + BrowsingContext* bc = aDocument->GetBrowsingContext(); + return StaticPrefs::apz_allow_zooming() || (bc && bc->InRDMPane()); } static bool HasVisibleAnonymousContents(Document* aDoc) { @@ -903,7 +900,7 @@ void nsLayoutUtils::GetMarkerSpokenText(const nsIContent* aContent, return; } - if (frame->StyleContent()->ContentCount() > 0) { + if (!frame->StyleContent()->NonAltContentItems().IsEmpty()) { for (nsIFrame* child : frame->PrincipalChildList()) { nsIFrame::RenderedText text = child->GetRenderedText(); aText += text.mString; @@ -2134,6 +2131,7 @@ const nsIFrame* nsLayoutUtils::FindNearestCommonAncestorFrameWithinBlock( bool nsLayoutUtils::AuthorSpecifiedBorderBackgroundDisablesTheming( StyleAppearance aAppearance) { return aAppearance == StyleAppearance::NumberInput || + aAppearance == StyleAppearance::PasswordInput || aAppearance == StyleAppearance::Button || aAppearance == StyleAppearance::Textfield || aAppearance == StyleAppearance::Textarea || @@ -3501,7 +3499,7 @@ nsIFrame* nsLayoutUtils::GetFirstNonAnonymousFrame(nsIFrame* aFrame) { struct BoxToRect : public nsLayoutUtils::BoxCallback { const nsIFrame* mRelativeTo; RectCallback* mCallback; - uint32_t mFlags; + nsLayoutUtils::GetAllInFlowRectsFlags mFlags; // If the frame we're measuring relative to is the root, we know all frames // are descendants of it, so we don't need to compute the common ancestor // between a frame and mRelativeTo. @@ -3513,7 +3511,8 @@ struct BoxToRect : public nsLayoutUtils::BoxCallback { bool mRelativeToIsTarget; BoxToRect(const nsIFrame* aTargetFrame, const nsIFrame* aRelativeTo, - RectCallback* aCallback, uint32_t aFlags) + RectCallback* aCallback, + nsLayoutUtils::GetAllInFlowRectsFlags aFlags) : mRelativeTo(aRelativeTo), mCallback(aCallback), mFlags(aFlags), @@ -3526,21 +3525,34 @@ struct BoxToRect : public nsLayoutUtils::BoxCallback { const bool usingSVGOuterFrame = !!outer; if (!outer) { outer = aFrame; - switch (mFlags & nsLayoutUtils::RECTS_WHICH_BOX_MASK) { - case nsLayoutUtils::RECTS_USE_CONTENT_BOX: - r = aFrame->GetContentRectRelativeToSelf(); - break; - case nsLayoutUtils::RECTS_USE_PADDING_BOX: - r = aFrame->GetPaddingRectRelativeToSelf(); - break; - case nsLayoutUtils::RECTS_USE_MARGIN_BOX: - r = aFrame->GetMarginRectRelativeToSelf(); - break; - default: // Use the border box - r = aFrame->GetRectRelativeToSelf(); + if (mFlags.contains( + nsLayoutUtils::GetAllInFlowRectsFlag::UseContentBox)) { + r = aFrame->GetContentRectRelativeToSelf(); + } else if (mFlags.contains( + nsLayoutUtils::GetAllInFlowRectsFlag::UsePaddingBox)) { + r = aFrame->GetPaddingRectRelativeToSelf(); + } else if (mFlags.contains( + nsLayoutUtils::GetAllInFlowRectsFlag::UseMarginBox)) { + r = aFrame->GetMarginRectRelativeToSelf(); + } else if (mFlags.contains(nsLayoutUtils::GetAllInFlowRectsFlag:: + UseMarginBoxWithAutoResolvedAsZero)) { + r = aFrame->GetRectRelativeToSelf(); + const auto& styleMargin = aFrame->StyleMargin()->mMargin; + nsMargin usedMargin = + aFrame->GetUsedMargin().ApplySkipSides(aFrame->GetSkipSides()); + for (const Side side : AllPhysicalSides()) { + if (styleMargin.Get(side).IsAuto()) { + usedMargin.Side(side) = 0; + } + } + r.Inflate(usedMargin); + } else { + // Use the border-box. + r = aFrame->GetRectRelativeToSelf(); } } - if (mFlags & nsLayoutUtils::RECTS_ACCOUNT_FOR_TRANSFORMS) { + if (mFlags.contains( + nsLayoutUtils::GetAllInFlowRectsFlag::AccountForTransforms)) { const bool isAncestorKnown = [&] { if (mRelativeToIsRoot) { return true; @@ -3571,7 +3583,7 @@ struct MOZ_RAII BoxToRectAndText : public BoxToRect { BoxToRectAndText(const nsIFrame* aTargetFrame, const nsIFrame* aRelativeTo, RectCallback* aCallback, Sequence<nsString>* aTextList, - uint32_t aFlags) + nsLayoutUtils::GetAllInFlowRectsFlags aFlags) : BoxToRect(aTargetFrame, aRelativeTo, aCallback, aFlags), mTextList(aTextList) {} @@ -3612,7 +3624,7 @@ struct MOZ_RAII BoxToRectAndText : public BoxToRect { void nsLayoutUtils::GetAllInFlowRects(nsIFrame* aFrame, const nsIFrame* aRelativeTo, RectCallback* aCallback, - uint32_t aFlags) { + GetAllInFlowRectsFlags aFlags) { BoxToRect converter(aFrame, aRelativeTo, aCallback, aFlags); GetAllInFlowBoxes(aFrame, &converter); } @@ -3621,7 +3633,7 @@ void nsLayoutUtils::GetAllInFlowRectsAndTexts(nsIFrame* aFrame, const nsIFrame* aRelativeTo, RectCallback* aCallback, Sequence<nsString>* aTextList, - uint32_t aFlags) { + GetAllInFlowRectsFlags aFlags) { BoxToRectAndText converter(aFrame, aRelativeTo, aCallback, aTextList, aFlags); GetAllInFlowBoxes(aFrame, &converter); } @@ -3652,7 +3664,7 @@ nsIFrame* nsLayoutUtils::GetContainingBlockForClientRect(nsIFrame* aFrame) { nsRect nsLayoutUtils::GetAllInFlowRectsUnion(nsIFrame* aFrame, const nsIFrame* aRelativeTo, - uint32_t aFlags) { + GetAllInFlowRectsFlags aFlags) { RectAccumulator accumulator; GetAllInFlowRects(aFrame, aRelativeTo, &accumulator, aFlags); return accumulator.mResultRect.IsEmpty() ? accumulator.mFirstRect @@ -4613,7 +4625,7 @@ static nscoord AddIntrinsicSizeOffset( LayoutDeviceIntSize devSize = pc->Theme()->GetMinimumWidgetSize( pc, aFrame, disp->EffectiveAppearance()); nscoord themeSize = pc->DevPixelsToAppUnits( - aAxis == eAxisVertical ? devSize.height : devSize.width); + aAxis == PhysicalAxis::Vertical ? devSize.height : devSize.width); // GetMinimumWidgetSize() returns a border-box width. themeSize += aOffsets.margin; if (themeSize > result) { @@ -4644,7 +4656,7 @@ nscoord nsLayoutUtils::IntrinsicForAxis( aPercentageBasis.isSome(), "grid layout should always pass a percentage basis"); - const bool horizontalAxis = MOZ_LIKELY(aAxis == eAxisHorizontal); + const bool horizontalAxis = MOZ_LIKELY(aAxis == PhysicalAxis::Horizontal); #ifdef DEBUG_INTRINSIC_WIDTH nsIFrame::IndentBy(stderr, gNoiseIndent); aFrame->ListTag(stderr); @@ -4676,7 +4688,7 @@ nscoord nsLayoutUtils::IntrinsicForAxis( horizontalAxis ? stylePos->mMaxWidth : stylePos->mMaxHeight; PhysicalAxis ourInlineAxis = - aFrame->GetWritingMode().PhysicalAxis(eLogicalAxisInline); + aFrame->GetWritingMode().PhysicalAxis(LogicalAxis::Inline); const bool isInlineAxis = aAxis == ourInlineAxis; auto resetIfKeywords = [](StyleSize& aSize, StyleSize& aMinSize, @@ -4897,8 +4909,8 @@ nscoord nsLayoutUtils::IntrinsicForAxis( // We are computing the size of |aFrame|, so we use the inline & block // dimensions of |aFrame|. result = ratio.ComputeRatioDependentSize( - isInlineAxis ? eLogicalAxisInline : eLogicalAxisBlock, childWM, h, - *contentBoxSizeToBoxSizingAdjust); + isInlineAxis ? LogicalAxis::Inline : LogicalAxis::Block, childWM, + h, *contentBoxSizeToBoxSizingAdjust); // We have get the inlineSizeForAspectRatio value, so we don't have to // recompute this again below. inlineSizeFromAspectRatio.emplace(result); @@ -4910,8 +4922,8 @@ nscoord nsLayoutUtils::IntrinsicForAxis( GetPercentBSize(styleMaxBSize, aFrame, horizontalAxis, h))) { h = std::max(0, h - bSizeTakenByBoxSizing); nscoord maxISize = ratio.ComputeRatioDependentSize( - isInlineAxis ? eLogicalAxisInline : eLogicalAxisBlock, childWM, h, - *contentBoxSizeToBoxSizingAdjust); + isInlineAxis ? LogicalAxis::Inline : LogicalAxis::Block, childWM, + h, *contentBoxSizeToBoxSizingAdjust); if (maxISize < result) { result = maxISize; } @@ -4926,8 +4938,8 @@ nscoord nsLayoutUtils::IntrinsicForAxis( GetPercentBSize(styleMinBSize, aFrame, horizontalAxis, h))) { h = std::max(0, h - bSizeTakenByBoxSizing); nscoord minISize = ratio.ComputeRatioDependentSize( - isInlineAxis ? eLogicalAxisInline : eLogicalAxisBlock, childWM, h, - *contentBoxSizeToBoxSizingAdjust); + isInlineAxis ? LogicalAxis::Inline : LogicalAxis::Block, childWM, + h, *contentBoxSizeToBoxSizingAdjust); if (minISize > result) { result = minISize; } @@ -4990,9 +5002,9 @@ nscoord nsLayoutUtils::IntrinsicForAxis( GetDefiniteSizeTakenByBoxSizing(boxSizingForAR, aFrame, !isInlineAxis, ignorePadding, aPercentageBasis); bSize -= bSizeTakenByBoxSizing; - inlineSizeFromAspectRatio.emplace(ar.ComputeRatioDependentSize( - LogicalAxis::eLogicalAxisInline, childWM, bSize, - *contentBoxSizeToBoxSizingAdjust)); + inlineSizeFromAspectRatio.emplace( + ar.ComputeRatioDependentSize(LogicalAxis::Inline, childWM, bSize, + *contentBoxSizeToBoxSizingAdjust)); } } @@ -5027,7 +5039,7 @@ nscoord nsLayoutUtils::IntrinsicForContainer(gfxContext* aRenderingContext, MOZ_ASSERT(aFrame && aFrame->GetParent()); // We want the size aFrame will contribute to its parent's inline-size. PhysicalAxis axis = - aFrame->GetParent()->GetWritingMode().PhysicalAxis(eLogicalAxisInline); + aFrame->GetParent()->GetWritingMode().PhysicalAxis(LogicalAxis::Inline); return IntrinsicForAxis(axis, aRenderingContext, aFrame, aType, Nothing(), aFlags); } @@ -5051,12 +5063,13 @@ nscoord nsLayoutUtils::MinSizeContributionForAxis( // Note: this method is only meant for grid/flex items. const nsStylePosition* const stylePos = aFrame->StylePosition(); - StyleSize size = - aAxis == eAxisHorizontal ? stylePos->mMinWidth : stylePos->mMinHeight; - StyleMaxSize maxSize = - aAxis == eAxisHorizontal ? stylePos->mMaxWidth : stylePos->mMaxHeight; + StyleSize size = aAxis == PhysicalAxis::Horizontal ? stylePos->mMinWidth + : stylePos->mMinHeight; + StyleMaxSize maxSize = aAxis == PhysicalAxis::Horizontal + ? stylePos->mMaxWidth + : stylePos->mMaxHeight; auto childWM = aFrame->GetWritingMode(); - PhysicalAxis ourInlineAxis = childWM.PhysicalAxis(eLogicalAxisInline); + PhysicalAxis ourInlineAxis = childWM.PhysicalAxis(LogicalAxis::Inline); // According to the spec, max-content and min-content should behave as the // property's initial values in block axis. // It also make senses to use the initial values for -moz-fit-content and @@ -5080,7 +5093,8 @@ nscoord nsLayoutUtils::MinSizeContributionForAxis( minSize = 0; fixedMinSize = &minSize; } else { - size = aAxis == eAxisHorizontal ? stylePos->mWidth : stylePos->mHeight; + size = aAxis == PhysicalAxis::Horizontal ? stylePos->mWidth + : stylePos->mHeight; // This is same as above: keywords should behaves as property's initial // values in block axis. if (aAxis != ourInlineAxis && size.BehavesLikeInitialValueOnBlockAxis()) { @@ -5323,7 +5337,6 @@ nscoord nsLayoutUtils::MinISizeFromInline(nsIFrame* aFrame, "should not be container for font size inflation"); nsIFrame::InlineMinISizeData data; - DISPLAY_MIN_INLINE_SIZE(aFrame, data.mPrevLines); aFrame->AddInlineMinISize(aRenderingContext, &data); data.ForceBreak(); return data.mPrevLines; @@ -5336,7 +5349,6 @@ nscoord nsLayoutUtils::PrefISizeFromInline(nsIFrame* aFrame, "should not be container for font size inflation"); nsIFrame::InlinePrefISizeData data; - DISPLAY_PREF_INLINE_SIZE(aFrame, data.mPrevLines); aFrame->AddInlinePrefISize(aRenderingContext, &data); data.ForceBreak(); return data.mPrevLines; @@ -7449,7 +7461,7 @@ SurfaceFromElementResult nsLayoutUtils::SurfaceFromElement( SurfaceFromElementResult nsLayoutUtils::SurfaceFromElement( HTMLVideoElement* aElement, uint32_t aSurfaceFlags, - RefPtr<DrawTarget>& aTarget) { + RefPtr<DrawTarget>& aTarget, bool aOptimizeSourceSurface) { SurfaceFromElementResult result; result.mAlphaType = gfxAlphaType::Opaque; // Assume opaque. @@ -7484,7 +7496,7 @@ SurfaceFromElementResult nsLayoutUtils::SurfaceFromElement( result.mIsWriteOnly = CanvasUtils::CheckWriteOnlySecurity( result.mCORSUsed, result.mPrincipal, result.mHadCrossOriginRedirects); - if (aTarget) { + if (aTarget && aOptimizeSourceSurface) { // They gave us a DrawTarget to optimize for, so even though we have a // layers::Image, we should unconditionally try to grab a SourceSurface and // try to optimize it. @@ -8901,13 +8913,7 @@ ScrollMetadata nsLayoutUtils::ComputeScrollMetadata( } if (primaryFrame) { WritingMode writingModeOfRootScrollFrame = primaryFrame->GetWritingMode(); - WritingMode::BlockDir blockDirOfRootScrollFrame = - writingModeOfRootScrollFrame.GetBlockDir(); - WritingMode::InlineDir inlineDirOfRootScrollFrame = - writingModeOfRootScrollFrame.GetInlineDir(); - if (blockDirOfRootScrollFrame == WritingMode::BlockDir::eBlockRL || - (blockDirOfRootScrollFrame == WritingMode::BlockDir::eBlockTB && - inlineDirOfRootScrollFrame == WritingMode::InlineDir::eInlineRTL)) { + if (writingModeOfRootScrollFrame.IsPhysicalRTL()) { metadata.SetIsAutoDirRootContentRTL(true); } } @@ -9228,7 +9234,8 @@ CSSRect nsLayoutUtils::GetBoundingFrameRect( CSSRect result; nsIFrame* relativeTo = aRootScrollFrame->GetScrolledFrame(); result = CSSRect::FromAppUnits(nsLayoutUtils::GetAllInFlowRectsUnion( - aFrame, relativeTo, nsLayoutUtils::RECTS_ACCOUNT_FOR_TRANSFORMS)); + aFrame, relativeTo, + nsLayoutUtils::GetAllInFlowRectsFlag::AccountForTransforms)); // If the element is contained in a scrollable frame that is not // the root scroll frame, make sure to clip the result so that it is @@ -9769,24 +9776,8 @@ void nsLayoutUtils::ComputeSystemFont(nsFont* aSystemFont, /* static */ bool nsLayoutUtils::ShouldHandleMetaViewport(const Document* aDocument) { - auto metaViewportOverride = nsIDocShell::META_VIEWPORT_OVERRIDE_NONE; - if (aDocument) { - if (nsIDocShell* docShell = aDocument->GetDocShell()) { - metaViewportOverride = docShell->GetMetaViewportOverride(); - } - } - switch (metaViewportOverride) { - case nsIDocShell::META_VIEWPORT_OVERRIDE_ENABLED: - return true; - case nsIDocShell::META_VIEWPORT_OVERRIDE_DISABLED: - return false; - default: - MOZ_ASSERT(metaViewportOverride == - nsIDocShell::META_VIEWPORT_OVERRIDE_NONE); - // The META_VIEWPORT_OVERRIDE_NONE case means that there is no override - // and we rely solely on the StaticPrefs. - return StaticPrefs::dom_meta_viewport_enabled(); - } + BrowsingContext* bc = aDocument->GetBrowsingContext(); + return StaticPrefs::dom_meta_viewport_enabled() || (bc && bc->InRDMPane()); } /* static */ |