summaryrefslogtreecommitdiffstats
path: root/layout/base/nsLayoutUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base/nsLayoutUtils.cpp')
-rw-r--r--layout/base/nsLayoutUtils.cpp141
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 */