summaryrefslogtreecommitdiffstats
path: root/layout/forms/nsFieldSetFrame.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/forms/nsFieldSetFrame.h')
-rw-r--r--layout/forms/nsFieldSetFrame.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/layout/forms/nsFieldSetFrame.h b/layout/forms/nsFieldSetFrame.h
new file mode 100644
index 0000000000..c3b9f67e0a
--- /dev/null
+++ b/layout/forms/nsFieldSetFrame.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/. */
+
+#ifndef nsFieldSetFrame_h___
+#define nsFieldSetFrame_h___
+
+#include "mozilla/Attributes.h"
+#include "ImgDrawResult.h"
+#include "nsContainerFrame.h"
+#include "nsIScrollableFrame.h"
+
+class nsFieldSetFrame final : public nsContainerFrame {
+ typedef mozilla::image::ImgDrawResult ImgDrawResult;
+
+ public:
+ NS_DECL_FRAMEARENA_HELPERS(nsFieldSetFrame)
+ NS_DECL_QUERYFRAME
+
+ explicit nsFieldSetFrame(ComputedStyle* aStyle, nsPresContext* aPresContext);
+
+ nscoord GetIntrinsicISize(gfxContext* aRenderingContext,
+ mozilla::IntrinsicISizeType);
+ nscoord GetMinISize(gfxContext* aRenderingContext) override;
+ nscoord GetPrefISize(gfxContext* aRenderingContext) override;
+
+ /**
+ * The area to paint box-shadows around. It's the border rect except
+ * when there's a <legend> we offset the y-position to the center of it.
+ */
+ nsRect VisualBorderRectRelativeToSelf() const override;
+
+ void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize,
+ const ReflowInput& aReflowInput,
+ nsReflowStatus& aStatus) override;
+
+ nscoord SynthesizeFallbackBaseline(
+ mozilla::WritingMode aWM,
+ BaselineSharingGroup aBaselineGroup) const override;
+ BaselineSharingGroup GetDefaultBaselineSharingGroup() const override;
+ Maybe<nscoord> GetNaturalBaselineBOffset(
+ mozilla::WritingMode aWM, BaselineSharingGroup aBaselineGroup,
+ BaselineExportContext aExportContext) const override;
+
+ void BuildDisplayList(nsDisplayListBuilder* aBuilder,
+ const nsDisplayListSet& aLists) override;
+
+ ImgDrawResult PaintBorder(nsDisplayListBuilder* aBuilder,
+ gfxContext& aRenderingContext, nsPoint aPt,
+ const nsRect& aDirtyRect);
+
+ void SetInitialChildList(ChildListID aListID,
+ nsFrameList&& aChildList) override;
+ void AppendFrames(ChildListID aListID, nsFrameList&& aFrameList) override;
+ void InsertFrames(ChildListID aListID, nsIFrame* aPrevFrame,
+ const nsLineList::iterator* aPrevFrameLine,
+ nsFrameList&& aFrameList) override;
+#ifdef DEBUG
+ void RemoveFrame(DestroyContext&, ChildListID aListID,
+ nsIFrame* aOldFrame) override;
+#endif
+
+ bool IsFrameOfType(uint32_t aFlags) const override {
+ return nsContainerFrame::IsFrameOfType(
+ aFlags & ~nsIFrame::eCanContainOverflowContainers);
+ }
+ nsIScrollableFrame* GetScrollTargetFrame() const override;
+
+ // Return the block wrapper around our kids.
+ void AppendDirectlyOwnedAnonBoxes(nsTArray<OwnedAnonBox>& aResult) override;
+
+#ifdef ACCESSIBILITY
+ virtual mozilla::a11y::AccType AccessibleType() override;
+#endif
+
+#ifdef DEBUG_FRAME_DUMP
+ virtual nsresult GetFrameName(nsAString& aResult) const override {
+ return MakeFrameName(u"FieldSet"_ns, aResult);
+ }
+#endif
+
+ /**
+ * Return the anonymous frame that contains all descendants except the legend
+ * frame. This can be a block/grid/flex/scroll frame. It always has
+ * the pseudo type nsCSSAnonBoxes::fieldsetContent. If it's a scroll frame,
+ * the scrolled frame can be a block/grid/flex frame.
+ * This may return null, for example for a fieldset that is a true overflow
+ * container.
+ */
+ nsContainerFrame* GetInner() const;
+
+ /**
+ * Return the frame that represents the rendered legend if any.
+ * https://html.spec.whatwg.org/multipage/rendering.html#rendered-legend
+ */
+ nsIFrame* GetLegend() const;
+
+ /** @see mLegendSpace below */
+ nscoord LegendSpace() const { return mLegendSpace; }
+
+ protected:
+ /**
+ * Convenience method to create a continuation for aChild after we've
+ * reflowed it and got the reflow status aStatus.
+ */
+ void EnsureChildContinuation(nsIFrame* aChild, const nsReflowStatus& aStatus);
+
+ mozilla::LogicalRect mLegendRect;
+
+ // This is how much to subtract from our inner frame's content-box block-size
+ // to account for a protruding legend. It's zero if there's no legend or
+ // the legend fits entirely inside our start border.
+ nscoord mLegendSpace;
+};
+
+#endif // nsFieldSetFrame_h___