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