forked from mirrors/gecko-dev
		
	 5a6d8228c8
			
		
	
	
		5a6d8228c8
		
	
	
	
	
		
			
			Actually, there's not so much we can improve right now, in the sense that: * We need the ::-moz-page-content pseudo-element to be able to set `display` on the page, since that's a style rule rather than a @page rule. We could get away without it. * Keeping the current code-path (slightly cleaned up) is less code, for now at least. We can have a separate code-path or what not that actually performs the @page rule selector-matching and what not if needed when we get to named pages or other page selectors. Selectors like :first should be pretty trivial to implement, actually. We make some paged mode anon boxes non-inheriting anon boxes. This allows us to share the styles and is generally nicer. They don't need to inherit from anywhere. We could remove the origin handling and don't look at UA rules or what not, but it seems pretty harmless to do that. We also fix the name of the pseudo-elements to match the capitalization. Differential Revision: https://phabricator.services.mozilla.com/D104772
		
			
				
	
	
		
			135 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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/. */
 | |
| #ifndef nsPageFrame_h___
 | |
| #define nsPageFrame_h___
 | |
| 
 | |
| #include "mozilla/Attributes.h"
 | |
| #include "nsContainerFrame.h"
 | |
| #include "nsLeafFrame.h"
 | |
| 
 | |
| class nsFontMetrics;
 | |
| class nsSharedPageData;
 | |
| 
 | |
| namespace mozilla {
 | |
| class PresShell;
 | |
| }  // namespace mozilla
 | |
| 
 | |
| // Page frame class. Represents an individual page, in paginated mode.
 | |
| class nsPageFrame final : public nsContainerFrame {
 | |
|  public:
 | |
|   NS_DECL_QUERYFRAME
 | |
|   NS_DECL_FRAMEARENA_HELPERS(nsPageFrame)
 | |
| 
 | |
|   friend nsPageFrame* NS_NewPageFrame(mozilla::PresShell* aPresShell,
 | |
|                                       ComputedStyle* aStyle);
 | |
| 
 | |
|   void Reflow(nsPresContext* aPresContext, ReflowOutput& aReflowOutput,
 | |
|               const ReflowInput& aReflowInput,
 | |
|               nsReflowStatus& aStatus) override;
 | |
| 
 | |
|   void BuildDisplayList(nsDisplayListBuilder* aBuilder,
 | |
|                         const nsDisplayListSet& aLists) override;
 | |
| 
 | |
| #ifdef DEBUG_FRAME_DUMP
 | |
|   nsresult GetFrameName(nsAString& aResult) const override;
 | |
| #endif
 | |
| 
 | |
|   //////////////////
 | |
|   // For Printing
 | |
|   //////////////////
 | |
| 
 | |
|   // Determine this page's page-number, based on its previous continuation
 | |
|   // (whose page number is presumed to already be known).
 | |
|   void DeterminePageNum();
 | |
|   int32_t GetPageNum() const { return mPageNum; }
 | |
| 
 | |
|   void SetSharedPageData(nsSharedPageData* aPD);
 | |
|   nsSharedPageData* GetSharedPageData() const { return mPD; }
 | |
| 
 | |
|   // We must allow Print Preview UI to have a background, no matter what the
 | |
|   // user's settings
 | |
|   bool HonorPrintBackgroundSettings() const override { return false; }
 | |
| 
 | |
|   void PaintHeaderFooter(gfxContext& aRenderingContext, nsPoint aPt,
 | |
|                          bool aSubpixelAA);
 | |
| 
 | |
|   const nsMargin& GetUsedPageContentMargin() const {
 | |
|     return mPageContentMargin;
 | |
|   }
 | |
| 
 | |
|   uint32_t IndexOnSheet() const { return mIndexOnSheet; }
 | |
|   void SetIndexOnSheet(uint32_t aIndexOnSheet) {
 | |
|     mIndexOnSheet = aIndexOnSheet;
 | |
|   }
 | |
| 
 | |
|  protected:
 | |
|   explicit nsPageFrame(ComputedStyle* aStyle, nsPresContext* aPresContext);
 | |
|   virtual ~nsPageFrame();
 | |
| 
 | |
|   typedef enum { eHeader, eFooter } nsHeaderFooterEnum;
 | |
| 
 | |
|   nscoord GetXPosition(gfxContext& aRenderingContext,
 | |
|                        nsFontMetrics& aFontMetrics, const nsRect& aRect,
 | |
|                        int32_t aJust, const nsString& aStr);
 | |
| 
 | |
|   nsReflowStatus ReflowPageContent(nsPresContext*,
 | |
|                                    const ReflowInput& aPageReflowInput);
 | |
| 
 | |
|   void DrawHeaderFooter(gfxContext& aRenderingContext,
 | |
|                         nsFontMetrics& aFontMetrics,
 | |
|                         nsHeaderFooterEnum aHeaderFooter, int32_t aJust,
 | |
|                         const nsString& sStr, const nsRect& aRect,
 | |
|                         nscoord aHeight, nscoord aAscent, nscoord aWidth);
 | |
| 
 | |
|   void DrawHeaderFooter(gfxContext& aRenderingContext,
 | |
|                         nsFontMetrics& aFontMetrics,
 | |
|                         nsHeaderFooterEnum aHeaderFooter,
 | |
|                         const nsString& aStrLeft, const nsString& aStrRight,
 | |
|                         const nsString& aStrCenter, const nsRect& aRect,
 | |
|                         nscoord aAscent, nscoord aHeight);
 | |
| 
 | |
|   void ProcessSpecialCodes(const nsString& aStr, nsString& aNewStr);
 | |
| 
 | |
|   static constexpr int32_t kPageNumUnset = -1;
 | |
|   // 1-based page-num
 | |
|   int32_t mPageNum = kPageNumUnset;
 | |
| 
 | |
|   // 0-based index on the sheet that we belong to. Unused/meaningless if this
 | |
|   // page has frame state bit NS_PAGE_SKIPPED_BY_CUSTOM_RANGE.
 | |
|   uint32_t mIndexOnSheet = 0;
 | |
| 
 | |
|   // Note: this will be set before reflow, and it's strongly owned by our
 | |
|   // nsPageSequenceFrame, which outlives us.
 | |
|   nsSharedPageData* mPD = nullptr;
 | |
| 
 | |
|   nsMargin mPageContentMargin;
 | |
| };
 | |
| 
 | |
| class nsPageBreakFrame final : public nsLeafFrame {
 | |
|   NS_DECL_FRAMEARENA_HELPERS(nsPageBreakFrame)
 | |
| 
 | |
|   explicit nsPageBreakFrame(ComputedStyle* aStyle, nsPresContext* aPresContext);
 | |
|   ~nsPageBreakFrame();
 | |
| 
 | |
|   void Reflow(nsPresContext* aPresContext, ReflowOutput& aReflowOutput,
 | |
|               const ReflowInput& aReflowInput,
 | |
|               nsReflowStatus& aStatus) override;
 | |
| 
 | |
| #ifdef DEBUG_FRAME_DUMP
 | |
|   nsresult GetFrameName(nsAString& aResult) const override;
 | |
| #endif
 | |
| 
 | |
|  protected:
 | |
|   nscoord GetIntrinsicISize() override;
 | |
|   nscoord GetIntrinsicBSize() override;
 | |
| 
 | |
|   bool mHaveReflowed;
 | |
| 
 | |
|   friend nsIFrame* NS_NewPageBreakFrame(mozilla::PresShell* aPresShell,
 | |
|                                         ComputedStyle* aStyle);
 | |
| };
 | |
| 
 | |
| #endif /* nsPageFrame_h___ */
 |