diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /layout/style/nsStyleStructInlines.h | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/style/nsStyleStructInlines.h')
-rw-r--r-- | layout/style/nsStyleStructInlines.h | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/layout/style/nsStyleStructInlines.h b/layout/style/nsStyleStructInlines.h new file mode 100644 index 0000000000..0b2285476f --- /dev/null +++ b/layout/style/nsStyleStructInlines.h @@ -0,0 +1,203 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Inline methods that belong in nsStyleStruct.h, except that they + * require more headers. + */ + +#ifndef nsStyleStructInlines_h_ +#define nsStyleStructInlines_h_ + +#include "nsIFrame.h" +#include "nsStyleStruct.h" +#include "nsIContent.h" // for GetParent() +#include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak +#include "mozilla/SVGUtils.h" // for SVGUtils::IsInSVGTextSubtree + +bool nsStyleText::NewlineIsSignificant(const nsTextFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); + return NewlineIsSignificantStyle() && + !aContextFrame->ShouldSuppressLineBreak() && + !aContextFrame->Style()->IsTextCombined(); +} + +bool nsStyleText::WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); + return WhiteSpaceCanWrapStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame) && + !aContextFrame->Style()->IsTextCombined(); +} + +bool nsStyleText::WordCanWrap(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); + return WordCanWrapStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +bool nsStyleDisplay::IsBlockOutside(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + return aContextFrame->IsBlockFrame(); + } + return IsBlockOutsideStyle(); +} + +bool nsStyleDisplay::IsInlineOutside(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + return !aContextFrame->IsBlockFrame(); + } + return IsInlineOutsideStyle(); +} + +mozilla::StyleDisplay nsStyleDisplay::GetDisplay( + const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame) && + mDisplay != mozilla::StyleDisplay::None) { + return aContextFrame->IsBlockFrame() ? mozilla::StyleDisplay::Block + : mozilla::StyleDisplay::Inline; + } + return mDisplay; +} + +bool nsStyleDisplay::IsFloating(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + return IsFloatingStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +// If you change this function, also change the corresponding block in +// nsCSSFrameConstructor::ConstructFrameFromItemInternal that references +// this function in comments. +bool nsStyleDisplay::HasTransform(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + return HasTransformStyle() && + aContextFrame->IsFrameOfType(nsIFrame::eSupportsCSSTransforms); +} + +bool nsStyleDisplay::HasPerspective(const nsIFrame* aContextFrame) const { + MOZ_ASSERT(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); + return HasPerspectiveStyle() && + aContextFrame->IsFrameOfType(nsIFrame::eSupportsCSSTransforms); +} + +bool nsStyleDisplay::IsFixedPosContainingBlockForNonSVGTextFrames( + const mozilla::ComputedStyle& aStyle) const { + // NOTE: Any CSS properties that influence the output of this function + // should have the FIXPOS_CB flag set on them. + NS_ASSERTION(aStyle.StyleDisplay() == this, "unexpected aStyle"); + + if (mWillChange.bits & mozilla::StyleWillChangeBits::FIXPOS_CB) { + return true; + } + + return aStyle.StyleEffects()->HasFilters() || + aStyle.StyleEffects()->HasBackdropFilters(); +} + +bool nsStyleDisplay:: + IsFixedPosContainingBlockForContainLayoutAndPaintSupportingFrames() const { + return IsContainPaint() || IsContainLayout(); +} + +bool nsStyleDisplay::IsFixedPosContainingBlockForTransformSupportingFrames() + const { + // NOTE: Any CSS properties that influence the output of this function + // should have the FIXPOS_CB flag set on them. + return HasTransformStyle() || HasPerspectiveStyle(); +} + +bool nsStyleDisplay::IsFixedPosContainingBlock( + const nsIFrame* aContextFrame) const { + mozilla::ComputedStyle* style = aContextFrame->Style(); + NS_ASSERTION(style->StyleDisplay() == this, "unexpected aContextFrame"); + // NOTE: Any CSS properties that influence the output of this function + // should have the FIXPOS_CB flag set on them. + if (!IsFixedPosContainingBlockForNonSVGTextFrames(*style) && + (!IsFixedPosContainingBlockForContainLayoutAndPaintSupportingFrames() || + !aContextFrame->IsFrameOfType( + nsIFrame::eSupportsContainLayoutAndPaint)) && + (!IsFixedPosContainingBlockForTransformSupportingFrames() || + !aContextFrame->IsFrameOfType(nsIFrame::eSupportsCSSTransforms))) { + return false; + } + if (mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame)) { + return false; + } + MOZ_ASSERT(IsAbsPosContainingBlock(aContextFrame), + "Any fixed-pos CB should also be an abs-pos CB"); + return true; +} + +bool nsStyleDisplay::IsAbsPosContainingBlock( + const nsIFrame* aContextFrame) const { + mozilla::ComputedStyle* style = aContextFrame->Style(); + NS_ASSERTION(style->StyleDisplay() == this, "unexpected aContextFrame"); + if (!IsPositionedStyle() && + !IsFixedPosContainingBlockForNonSVGTextFrames(*style) && + (!IsFixedPosContainingBlockForContainLayoutAndPaintSupportingFrames() || + !aContextFrame->IsFrameOfType( + nsIFrame::eSupportsContainLayoutAndPaint)) && + (!IsFixedPosContainingBlockForTransformSupportingFrames() || + !aContextFrame->IsFrameOfType(nsIFrame::eSupportsCSSTransforms))) { + return false; + } + return !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +bool nsStyleDisplay::IsRelativelyPositioned( + const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + return IsRelativelyPositionedStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +bool nsStyleDisplay::IsStickyPositioned(const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + return IsStickyPositionedStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +bool nsStyleDisplay::IsAbsolutelyPositioned( + const nsIFrame* aContextFrame) const { + NS_ASSERTION(aContextFrame->StyleDisplay() == this, + "unexpected aContextFrame"); + return IsAbsolutelyPositionedStyle() && + !mozilla::SVGUtils::IsInSVGTextSubtree(aContextFrame); +} + +mozilla::StylePointerEvents nsStyleUI::GetEffectivePointerEvents( + nsIFrame* aFrame) const { + if (aFrame->GetContent() && !aFrame->GetContent()->GetParent()) { + // The root frame is not allowed to have pointer-events: none, or else + // no frames could be hit test against and scrolling the viewport would + // not work. + return mozilla::StylePointerEvents::Auto; + } + return mPointerEvents; +} + +bool nsStyleBackground::HasLocalBackground() const { + NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, mImage) { + const nsStyleImageLayers::Layer& layer = mImage.mLayers[i]; + if (!layer.mImage.IsNone() && + layer.mAttachment == mozilla::StyleImageLayerAttachment::Local) { + return true; + } + } + return false; +} + +#endif /* !defined(nsStyleStructInlines_h_) */ |