1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef nsFirstLetterFrame_h__ 8 #define nsFirstLetterFrame_h__ 9 10 /* rendering object for CSS :first-letter pseudo-element */ 11 12 #include "mozilla/Attributes.h" 13 #include "nsContainerFrame.h" 14 15 class nsFirstLetterFrame final : public nsContainerFrame { 16 public: 17 NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS(nsFirstLetterFrame)18 NS_DECL_FRAMEARENA_HELPERS(nsFirstLetterFrame) 19 20 explicit nsFirstLetterFrame(ComputedStyle* aStyle, 21 nsPresContext* aPresContext) 22 : nsContainerFrame(aStyle, aPresContext, kClassID) {} 23 24 virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, 25 const nsDisplayListSet& aLists) override; 26 27 virtual void Init(nsIContent* aContent, nsContainerFrame* aParent, 28 nsIFrame* aPrevInFlow) override; 29 virtual void SetInitialChildList(ChildListID aListID, 30 nsFrameList& aChildList) override; 31 #ifdef DEBUG_FRAME_DUMP 32 virtual nsresult GetFrameName(nsAString& aResult) const override; 33 #endif 34 IsFloating()35 bool IsFloating() const { return HasAnyStateBits(NS_FRAME_OUT_OF_FLOW); } 36 IsFrameOfType(uint32_t aFlags)37 virtual bool IsFrameOfType(uint32_t aFlags) const override { 38 if (!IsFloating()) aFlags = aFlags & ~(nsIFrame::eLineParticipant); 39 return nsContainerFrame::IsFrameOfType(aFlags & 40 ~(nsIFrame::eBidiInlineContainer)); 41 } 42 43 virtual nscoord GetMinISize(gfxContext* aRenderingContext) override; 44 virtual nscoord GetPrefISize(gfxContext* aRenderingContext) override; 45 virtual void AddInlineMinISize(gfxContext* aRenderingContext, 46 InlineMinISizeData* aData) override; 47 virtual void AddInlinePrefISize(gfxContext* aRenderingContext, 48 InlinePrefISizeData* aData) override; 49 50 SizeComputationResult ComputeSize( 51 gfxContext* aRenderingContext, mozilla::WritingMode aWM, 52 const mozilla::LogicalSize& aCBSize, nscoord aAvailableISize, 53 const mozilla::LogicalSize& aMargin, 54 const mozilla::LogicalSize& aBorderPadding, 55 const mozilla::StyleSizeOverrides& aSizeOverrides, 56 mozilla::ComputeSizeFlags aFlags) override; 57 58 virtual void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize, 59 const ReflowInput& aReflowInput, 60 nsReflowStatus& aStatus) override; 61 62 virtual bool CanContinueTextRun() const override; 63 virtual nscoord GetLogicalBaseline( 64 mozilla::WritingMode aWritingMode) const override; 65 virtual LogicalSides GetLogicalSkipSides() const override; 66 67 // override of nsFrame method 68 virtual nsresult GetChildFrameContainingOffset( 69 int32_t inContentOffset, bool inHint, int32_t* outFrameContentOffset, 70 nsIFrame** outChildFrame) override; 71 GetFirstLetterBaseline()72 nscoord GetFirstLetterBaseline() const { return mBaseline; } 73 74 // For floating first letter frames, create a continuation for aChild and 75 // place it in the correct place. aContinuation is an outparam for the 76 // continuation that is created. aIsFluid determines if the continuation is 77 // fluid or not. 78 void CreateContinuationForFloatingParent(nsIFrame* aChild, 79 nsIFrame** aContinuation, 80 bool aIsFluid); 81 82 protected: 83 nscoord mBaseline; 84 85 void DrainOverflowFrames(nsPresContext* aPresContext); 86 }; 87 88 #endif /* nsFirstLetterFrame_h__ */ 89