summaryrefslogtreecommitdiffstats
path: root/layout/generic/nsBackdropFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--layout/generic/nsBackdropFrame.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/layout/generic/nsBackdropFrame.cpp b/layout/generic/nsBackdropFrame.cpp
new file mode 100644
index 0000000000..20d3fcd368
--- /dev/null
+++ b/layout/generic/nsBackdropFrame.cpp
@@ -0,0 +1,79 @@
+/* -*- 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 for CSS "::backdrop" */
+
+#include "nsBackdropFrame.h"
+
+#include "mozilla/PresShell.h"
+#include "nsDisplayList.h"
+
+using namespace mozilla;
+
+NS_IMPL_FRAMEARENA_HELPERS(nsBackdropFrame)
+
+#ifdef DEBUG_FRAME_DUMP
+nsresult nsBackdropFrame::GetFrameName(nsAString& aResult) const {
+ return MakeFrameName(u"Backdrop"_ns, aResult);
+}
+#endif
+
+/* virtual */
+ComputedStyle* nsBackdropFrame::GetParentComputedStyle(
+ 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 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(
+ gfxContext* aRenderingContext, WritingMode aWM, const LogicalSize& aCBSize,
+ nscoord aAvailableISize, const LogicalSize& aMargin,
+ const LogicalSize& aBorderPadding, const StyleSizeOverrides& aSizeOverrides,
+ ComputeSizeFlags aFlags) {
+ // Note that this frame is a child of the viewport frame.
+ LogicalSize result(aWM, 0xdeadbeef, NS_UNCONSTRAINEDSIZE);
+ if (aFlags.contains(ComputeSizeFlag::ShrinkWrap)) {
+ result.ISize(aWM) = 0;
+ } else {
+ result.ISize(aWM) =
+ aAvailableISize - aMargin.ISize(aWM) - aBorderPadding.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);
+ MOZ_ASSERT(aStatus.IsEmpty(), "Caller should pass a fresh reflow status!");
+
+ // Note that this frame is a child of the viewport frame.
+ WritingMode wm = aReflowInput.GetWritingMode();
+ aDesiredSize.SetSize(wm, aReflowInput.ComputedSizeWithBorderPadding(wm));
+}