diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
commit | 9e3c08db40b8916968b9f30096c7be3f00ce9647 (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /layout/generic/ViewportFrame.h | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/generic/ViewportFrame.h')
-rw-r--r-- | layout/generic/ViewportFrame.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/layout/generic/ViewportFrame.h b/layout/generic/ViewportFrame.h new file mode 100644 index 0000000000..2d3f8efc1b --- /dev/null +++ b/layout/generic/ViewportFrame.h @@ -0,0 +1,118 @@ +/* -*- 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/. */ + +/* + * rendering object that is the root of the frame tree, which contains + * the document's scrollbars and contains fixed-positioned elements + */ + +#ifndef mozilla_ViewportFrame_h +#define mozilla_ViewportFrame_h + +#include "mozilla/Attributes.h" +#include "nsContainerFrame.h" + +class nsPresContext; + +namespace mozilla { + +class nsDisplayWrapList; +class ServoRestyleState; + +/** + * ViewportFrame is the parent of a single child - the doc root frame or a + * scroll frame containing the doc root frame. ViewportFrame stores this child + * in its primary child list. + */ +class ViewportFrame : public nsContainerFrame { + public: + NS_DECL_QUERYFRAME + NS_DECL_FRAMEARENA_HELPERS(ViewportFrame) + + explicit ViewportFrame(ComputedStyle* aStyle, nsPresContext* aPresContext) + : ViewportFrame(aStyle, aPresContext, kClassID) {} + + virtual ~ViewportFrame() = default; // useful for debugging + + void Init(nsIContent* aContent, nsContainerFrame* aParent, + nsIFrame* aPrevInFlow) override; + +#ifdef DEBUG + void AppendFrames(ChildListID aListID, nsFrameList&& aFrameList) override; + void InsertFrames(ChildListID aListID, nsIFrame* aPrevFrame, + const nsLineList::iterator* aPrevFrameLine, + nsFrameList&& aFrameList) override; + void RemoveFrame(DestroyContext&, ChildListID, nsIFrame*) override; +#endif + + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists) override; + + nsDisplayWrapList* BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, + bool* aIsOpaque = nullptr); + + nscoord GetMinISize(gfxContext* aRenderingContext) override; + nscoord GetPrefISize(gfxContext* aRenderingContext) override; + void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; + + bool ComputeCustomOverflow(mozilla::OverflowAreas&) override { return false; } + + /** + * Adjust aReflowInput to account for scrollbars and pres shell + * GetVisualViewportSizeSet and + * GetContentDocumentFixedPositionMargins adjustments. + * @return the rect to use as containing block rect + */ + nsRect AdjustReflowInputAsContainingBlock(ReflowInput* aReflowInput) const; + + /** + * Update our style (and recursively the styles of any anonymous boxes we + * might own) + */ + void UpdateStyle(ServoRestyleState& aStyleSet); + + /** + * Return our single anonymous box child. + */ + void AppendDirectlyOwnedAnonBoxes(nsTArray<OwnedAnonBox>& aResult) override; + + // Returns adjusted viewport size to reflect the positions that position:fixed + // elements are attached. + nsSize AdjustViewportSizeForFixedPosition(const nsRect& aViewportRect) const; + +#ifdef DEBUG_FRAME_DUMP + virtual nsresult GetFrameName(nsAString& aResult) const override; +#endif + + protected: + ViewportFrame(ComputedStyle* aStyle, nsPresContext* aPresContext, ClassID aID) + : nsContainerFrame(aStyle, aPresContext, aID), mView(nullptr) {} + + /** + * Calculate how much room is available for fixed frames. That means + * determining if the viewport is scrollable and whether the vertical and/or + * horizontal scrollbars are visible. Adjust the computed width/height and + * available width for aReflowInput accordingly. + * @return the current scroll position, or 0,0 if not scrollable + */ + nsPoint AdjustReflowInputForScrollbars(ReflowInput* aReflowInput) const; + + nsView* GetViewInternal() const override { return mView; } + void SetViewInternal(nsView* aView) override { mView = aView; } + + private: + mozilla::FrameChildListID GetAbsoluteListID() const override { + return FrameChildListID::Fixed; + } + + nsView* mView; +}; + +} // namespace mozilla + +#endif // mozilla_ViewportFrame_h |