diff options
Diffstat (limited to '')
-rw-r--r-- | layout/generic/nsBackdropFrame.cpp | 79 |
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)); +} |