summaryrefslogtreecommitdiffstats
path: root/layout/printing/nsPrintEngine.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/printing/nsPrintEngine.h')
-rw-r--r--layout/printing/nsPrintEngine.h305
1 files changed, 305 insertions, 0 deletions
diff --git a/layout/printing/nsPrintEngine.h b/layout/printing/nsPrintEngine.h
new file mode 100644
index 000000000..643d9ee4e
--- /dev/null
+++ b/layout/printing/nsPrintEngine.h
@@ -0,0 +1,305 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */
+#ifndef nsPrintEngine_h___
+#define nsPrintEngine_h___
+
+#include "mozilla/Attributes.h"
+#include "mozilla/UniquePtr.h"
+
+#include "nsCOMPtr.h"
+
+#include "nsPrintObject.h"
+#include "nsPrintData.h"
+#include "nsFrameList.h"
+#include "nsIFrame.h"
+#include "nsIWebProgress.h"
+#include "mozilla/dom/HTMLCanvasElement.h"
+#include "nsIWebProgressListener.h"
+#include "nsWeakReference.h"
+
+// Interfaces
+#include "nsIObserver.h"
+
+// Classes
+class nsPagePrintTimer;
+class nsIDocShell;
+class nsIDocument;
+class nsIDocumentViewerPrint;
+class nsPrintObject;
+class nsIDocShell;
+class nsIPageSequenceFrame;
+
+//------------------------------------------------------------------------
+// nsPrintEngine Class
+//
+//------------------------------------------------------------------------
+class nsPrintEngine final : public nsIObserver,
+ public nsIWebProgressListener,
+ public nsSupportsWeakReference
+{
+public:
+ // nsISupports interface...
+ NS_DECL_ISUPPORTS
+
+ // nsIObserver
+ NS_DECL_NSIOBSERVER
+
+ NS_DECL_NSIWEBPROGRESSLISTENER
+
+ // Old nsIWebBrowserPrint methods; not cleaned up yet
+ NS_IMETHOD Print(nsIPrintSettings* aPrintSettings,
+ nsIWebProgressListener* aWebProgressListener);
+ NS_IMETHOD PrintPreview(nsIPrintSettings* aPrintSettings,
+ mozIDOMWindowProxy* aChildDOMWin,
+ nsIWebProgressListener* aWebProgressListener);
+ NS_IMETHOD GetIsFramesetDocument(bool *aIsFramesetDocument);
+ NS_IMETHOD GetIsIFrameSelected(bool *aIsIFrameSelected);
+ NS_IMETHOD GetIsRangeSelection(bool *aIsRangeSelection);
+ NS_IMETHOD GetIsFramesetFrameSelected(bool *aIsFramesetFrameSelected);
+ NS_IMETHOD GetPrintPreviewNumPages(int32_t *aPrintPreviewNumPages);
+ NS_IMETHOD EnumerateDocumentNames(uint32_t* aCount, char16_t*** aResult);
+ static nsresult GetGlobalPrintSettings(nsIPrintSettings** aPrintSettings);
+ NS_IMETHOD GetDoingPrint(bool *aDoingPrint);
+ NS_IMETHOD GetDoingPrintPreview(bool *aDoingPrintPreview);
+ NS_IMETHOD GetCurrentPrintSettings(nsIPrintSettings **aCurrentPrintSettings);
+
+
+ // This enum tells indicates what the default should be for the title
+ // if the title from the document is null
+ enum eDocTitleDefault {
+ eDocTitleDefBlank,
+ eDocTitleDefURLDoc
+ };
+
+ nsPrintEngine();
+
+ void Destroy();
+ void DestroyPrintingData();
+
+ nsresult Initialize(nsIDocumentViewerPrint* aDocViewerPrint,
+ nsIDocShell* aContainer,
+ nsIDocument* aDocument,
+ float aScreenDPI,
+ FILE* aDebugFile);
+
+ nsresult GetSeqFrameAndCountPages(nsIFrame*& aSeqFrame, int32_t& aCount);
+
+ //
+ // The following three methods are used for printing...
+ //
+ nsresult DocumentReadyForPrinting();
+ nsresult GetSelectionDocument(nsIDeviceContextSpec * aDevSpec,
+ nsIDocument ** aNewDoc);
+
+ nsresult SetupToPrintContent();
+ nsresult EnablePOsForPrinting();
+ nsPrintObject* FindSmallestSTF();
+
+ bool PrintDocContent(nsPrintObject* aPO, nsresult& aStatus);
+ nsresult DoPrint(nsPrintObject * aPO);
+
+ void SetPrintPO(nsPrintObject* aPO, bool aPrint);
+
+ void TurnScriptingOn(bool aDoTurnOn);
+ bool CheckDocumentForPPCaching();
+ void InstallPrintPreviewListener();
+
+ // nsIDocumentViewerPrint Printing Methods
+ bool HasPrintCallbackCanvas();
+ bool PrePrintPage();
+ bool PrintPage(nsPrintObject* aPOect, bool& aInRange);
+ bool DonePrintingPages(nsPrintObject* aPO, nsresult aResult);
+
+ //---------------------------------------------------------------------
+ void BuildDocTree(nsIDocShell * aParentNode,
+ nsTArray<nsPrintObject*> * aDocList,
+ nsPrintObject * aPO);
+ nsresult ReflowDocList(nsPrintObject * aPO, bool aSetPixelScale);
+
+ nsresult ReflowPrintObject(nsPrintObject * aPO);
+
+ void CheckForChildFrameSets(nsPrintObject* aPO);
+
+ void CalcNumPrintablePages(int32_t& aNumPages);
+ void ShowPrintProgress(bool aIsForPrinting, bool& aDoNotify);
+ nsresult CleanupOnFailure(nsresult aResult, bool aIsPrinting);
+ // If FinishPrintPreview() fails, caller may need to reset the state of the
+ // object, for example by calling CleanupOnFailure().
+ nsresult FinishPrintPreview();
+ static void CloseProgressDialog(nsIWebProgressListener* aWebProgressListener);
+ void SetDocAndURLIntoProgress(nsPrintObject* aPO,
+ nsIPrintProgressParams* aParams);
+ void EllipseLongString(nsAString& aStr, const uint32_t aLen, bool aDoFront);
+ nsresult CheckForPrinters(nsIPrintSettings* aPrintSettings);
+ void CleanupDocTitleArray(char16_t**& aArray, int32_t& aCount);
+
+ bool IsThereARangeSelection(nsPIDOMWindowOuter* aDOMWin);
+
+ void FirePrintingErrorEvent(nsresult aPrintError);
+ //---------------------------------------------------------------------
+
+
+ // Timer Methods
+ nsresult StartPagePrintTimer(nsPrintObject* aPO);
+
+ bool IsWindowsInOurSubTree(nsPIDOMWindowOuter* aDOMWindow);
+ static bool IsParentAFrameSet(nsIDocShell * aParent);
+ bool IsThereAnIFrameSelected(nsIDocShell* aDocShell,
+ nsPIDOMWindowOuter* aDOMWin,
+ bool& aIsParentFrameSet);
+
+ static nsPrintObject* FindPrintObjectByDOMWin(nsPrintObject* aParentObject,
+ nsPIDOMWindowOuter* aDOMWin);
+
+ // get the currently infocus frame for the document viewer
+ already_AddRefed<nsPIDOMWindowOuter> FindFocusedDOMWindow();
+
+ //---------------------------------------------------------------------
+ // Static Methods
+ //---------------------------------------------------------------------
+ static void GetDocumentTitleAndURL(nsIDocument* aDoc,
+ nsAString& aTitle,
+ nsAString& aURLStr);
+ void GetDisplayTitleAndURL(nsPrintObject* aPO,
+ nsAString& aTitle,
+ nsAString& aURLStr,
+ eDocTitleDefault aDefType);
+
+ static bool HasFramesetChild(nsIContent* aContent);
+
+ bool CheckBeforeDestroy();
+ nsresult Cancelled();
+
+ nsIPresShell* GetPrintPreviewPresShell() {return mPrtPreview->mPrintObject->mPresShell;}
+
+ float GetPrintPreviewScale() { return mPrtPreview->mPrintObject->
+ mPresContext->GetPrintPreviewScale(); }
+
+ static nsIPresShell* GetPresShellFor(nsIDocShell* aDocShell);
+
+ // These calls also update the DocViewer
+ void SetIsPrinting(bool aIsPrinting);
+ bool GetIsPrinting()
+ {
+ return mIsDoingPrinting;
+ }
+ void SetIsPrintPreview(bool aIsPrintPreview);
+ bool GetIsPrintPreview()
+ {
+ return mIsDoingPrintPreview;
+ }
+ void SetIsCreatingPrintPreview(bool aIsCreatingPrintPreview)
+ {
+ mIsCreatingPrintPreview = aIsCreatingPrintPreview;
+ }
+ bool GetIsCreatingPrintPreview()
+ {
+ return mIsCreatingPrintPreview;
+ }
+
+ void SetDisallowSelectionPrint(bool aDisallowSelectionPrint)
+ {
+ mDisallowSelectionPrint = aDisallowSelectionPrint;
+ }
+
+protected:
+ ~nsPrintEngine();
+
+ nsresult CommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
+ nsIWebProgressListener* aWebProgressListener,
+ nsIDOMDocument* aDoc);
+
+ nsresult DoCommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
+ nsIWebProgressListener* aWebProgressListener,
+ nsIDOMDocument* aDoc);
+
+ void FirePrintCompletionEvent();
+ static nsresult GetSeqFrameAndCountPagesInternal(nsPrintObject* aPO,
+ nsIFrame*& aSeqFrame,
+ int32_t& aCount);
+
+ static nsresult FindSelectionBoundsWithList(nsFrameList::Enumerator& aChildFrames,
+ nsIFrame * aParentFrame,
+ nsRect& aRect,
+ nsIFrame *& aStartFrame,
+ nsRect& aStartRect,
+ nsIFrame *& aEndFrame,
+ nsRect& aEndRect);
+
+ static nsresult FindSelectionBounds(nsIFrame * aParentFrame,
+ nsRect& aRect,
+ nsIFrame *& aStartFrame,
+ nsRect& aStartRect,
+ nsIFrame *& aEndFrame,
+ nsRect& aEndRect);
+
+ static nsresult GetPageRangeForSelection(nsIPageSequenceFrame* aPageSeqFrame,
+ nsIFrame** aStartFrame,
+ int32_t& aStartPageNum,
+ nsRect& aStartRect,
+ nsIFrame** aEndFrame,
+ int32_t& aEndPageNum,
+ nsRect& aEndRect);
+
+ static void MapContentForPO(nsPrintObject* aPO, nsIContent* aContent);
+
+ static void MapContentToWebShells(nsPrintObject* aRootPO, nsPrintObject* aPO);
+
+ static void SetPrintAsIs(nsPrintObject* aPO, bool aAsIs = true);
+
+ void DisconnectPagePrintTimer();
+
+ // Static member variables
+ bool mIsCreatingPrintPreview;
+ bool mIsDoingPrinting;
+ bool mIsDoingPrintPreview; // per DocumentViewer
+ bool mProgressDialogIsShown;
+
+ nsCOMPtr<nsIDocumentViewerPrint> mDocViewerPrint;
+ nsWeakPtr mContainer;
+ float mScreenDPI;
+
+ // We are the primary owner of our nsPrintData member vars. These vars
+ // are refcounted so that functions (e.g. nsPrintData methods) can create
+ // temporary owning references when they need to fire a callback that
+ // could conceivably destroy this nsPrintEngine owner object and all its
+ // member-data.
+ RefPtr<nsPrintData> mPrt;
+
+ nsPagePrintTimer* mPagePrintTimer;
+ nsWeakFrame mPageSeqFrame;
+
+ // Print Preview
+ RefPtr<nsPrintData> mPrtPreview;
+ RefPtr<nsPrintData> mOldPrtPreview;
+
+ nsCOMPtr<nsIDocument> mDocument;
+
+ FILE* mDebugFile;
+
+ int32_t mLoadCounter;
+ bool mDidLoadDataForPrinting;
+ bool mIsDestroying;
+ bool mDisallowSelectionPrint;
+
+ nsresult AfterNetworkPrint(bool aHandleError);
+
+ nsresult SetRootView(nsPrintObject* aPO,
+ bool& aDoReturn,
+ bool& aDocumentIsTopLevel,
+ nsSize& aAdjSize);
+ nsView* GetParentViewForRoot();
+ bool DoSetPixelScale();
+ void UpdateZoomRatio(nsPrintObject* aPO, bool aSetPixelScale);
+ nsresult ReconstructAndReflow(bool aDoSetPixelScale);
+ nsresult UpdateSelectionAndShrinkPrintObject(nsPrintObject* aPO,
+ bool aDocumentIsTopLevel);
+ nsresult InitPrintDocConstruction(bool aHandleError);
+ void FirePrintPreviewUpdateEvent();
+private:
+ nsPrintEngine& operator=(const nsPrintEngine& aOther) = delete;
+};
+
+#endif /* nsPrintEngine_h___ */