summaryrefslogtreecommitdiffstats
path: root/layout/generic/nsBackdropFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layout/generic/nsBackdropFrame.cpp')
-rw-r--r--layout/generic/nsBackdropFrame.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/layout/generic/nsBackdropFrame.cpp b/layout/generic/nsBackdropFrame.cpp
new file mode 100644
index 000000000..687c5b2e3
--- /dev/null
+++ b/layout/generic/nsBackdropFrame.cpp
@@ -0,0 +1,96 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+// vim:cindent:ts=2:et:sw=2:
+/* 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 for CSS "::backdrop" */
+
+#include "nsBackdropFrame.h"
+
+#include "nsDisplayList.h"
+
+using namespace mozilla;
+
+NS_IMPL_FRAMEARENA_HELPERS(nsBackdropFrame)
+
+/* virtual */ nsIAtom*
+nsBackdropFrame::GetType() const
+{
+ return nsGkAtoms::backdropFrame;
+}
+
+#ifdef DEBUG_FRAME_DUMP
+nsresult
+nsBackdropFrame::GetFrameName(nsAString& aResult) const
+{
+ return MakeFrameName(NS_LITERAL_STRING("Backdrop"), aResult);
+}
+#endif
+
+/* virtual */ nsStyleContext*
+nsBackdropFrame::GetParentStyleContext(nsIFrame** aProviderFrame) const
+{
+ // Style context of backdrop pseudo-element does not inherit from
+ // any element, per the Fullscreen API spec.
+ *aProviderFrame = nullptr;
+ return nullptr;
+}
+
+/* virtual */ void
+nsBackdropFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
+ const nsRect& aDirtyRect,
+ const nsDisplayListSet& aLists)
+{
+ DO_GLOBAL_REFLOW_COUNT_DSP("nsBackdropFrame");
+ // We want this frame to always be there even if its display value is
+ // none or contents so that we can respond to style change on it. To
+ // support those values, we skip painting ourselves in those cases.
+ auto display = StyleDisplay()->mDisplay;
+ if (display == mozilla::StyleDisplay::None ||
+ display == mozilla::StyleDisplay::Contents) {
+ return;
+ }
+
+ DisplayBorderBackgroundOutline(aBuilder, aLists);
+}
+
+/* virtual */ LogicalSize
+nsBackdropFrame::ComputeAutoSize(nsRenderingContext* aRenderingContext,
+ WritingMode aWM,
+ const LogicalSize& aCBSize,
+ nscoord aAvailableISize,
+ const LogicalSize& aMargin,
+ const LogicalSize& aBorder,
+ const LogicalSize& aPadding,
+ ComputeSizeFlags aFlags)
+{
+ // Note that this frame is a child of the viewport frame.
+ LogicalSize result(aWM, 0xdeadbeef, NS_UNCONSTRAINEDSIZE);
+ if (aFlags & ComputeSizeFlags::eShrinkWrap) {
+ result.ISize(aWM) = 0;
+ } else {
+ result.ISize(aWM) = aAvailableISize - aMargin.ISize(aWM) -
+ aBorder.ISize(aWM) - aPadding.ISize(aWM);
+ }
+ return result;
+}
+
+/* virtual */ void
+nsBackdropFrame::Reflow(nsPresContext* aPresContext,
+ ReflowOutput& aDesiredSize,
+ const ReflowInput& aReflowInput,
+ nsReflowStatus& aStatus)
+{
+ MarkInReflow();
+ DO_GLOBAL_REFLOW_COUNT("nsBackdropFrame");
+ DISPLAY_REFLOW(aPresContext, this, aReflowInput, aDesiredSize, aStatus);
+
+ // Note that this frame is a child of the viewport frame.
+ WritingMode wm = aReflowInput.GetWritingMode();
+ LogicalMargin borderPadding = aReflowInput.ComputedLogicalBorderPadding();
+ nscoord isize = aReflowInput.ComputedISize() + borderPadding.IStartEnd(wm);
+ nscoord bsize = aReflowInput.ComputedBSize() + borderPadding.BStartEnd(wm);
+ aDesiredSize.SetSize(wm, LogicalSize(wm, isize, bsize));
+ aStatus = NS_FRAME_COMPLETE;
+}