2017-10-27 20:33:53 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2017-12-04 20:44:17 +03:00
|
|
|
#ifndef nsPrintJob_h
|
|
|
|
#define nsPrintJob_h
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2011-12-16 23:42:07 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2017-01-03 14:10:11 +03:00
|
|
|
#include "mozilla/UniquePtr.h"
|
2011-12-16 23:42:07 +04:00
|
|
|
|
2004-01-28 14:17:14 +03:00
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
#include "nsPrintObject.h"
|
|
|
|
#include "nsPrintData.h"
|
2011-08-25 00:54:29 +04:00
|
|
|
#include "nsFrameList.h"
|
2017-01-09 11:26:31 +03:00
|
|
|
#include "nsIFrame.h"
|
2012-09-04 17:29:27 +04:00
|
|
|
#include "nsIWebProgress.h"
|
2013-01-04 09:16:14 +04:00
|
|
|
#include "mozilla/dom/HTMLCanvasElement.h"
|
2012-09-04 17:29:27 +04:00
|
|
|
#include "nsIWebProgressListener.h"
|
|
|
|
#include "nsWeakReference.h"
|
2002-08-21 16:01:05 +04:00
|
|
|
|
|
|
|
// Interfaces
|
|
|
|
#include "nsIObserver.h"
|
|
|
|
|
|
|
|
// Classes
|
|
|
|
class nsPagePrintTimer;
|
2014-01-07 02:34:15 +04:00
|
|
|
class nsIDocShell;
|
2006-12-10 11:05:05 +03:00
|
|
|
class nsIDocumentViewerPrint;
|
|
|
|
class nsPrintObject;
|
|
|
|
class nsIDocShell;
|
|
|
|
class nsIPageSequenceFrame;
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2019-01-02 16:05:23 +03:00
|
|
|
namespace mozilla {
|
2019-04-16 10:25:10 +03:00
|
|
|
class PresShell;
|
2019-01-02 16:05:23 +03:00
|
|
|
namespace dom {
|
|
|
|
class Document;
|
|
|
|
}
|
|
|
|
} // namespace mozilla
|
|
|
|
|
2017-12-04 20:44:17 +03:00
|
|
|
/**
|
|
|
|
* A print job may be instantiated either for printing to an actual physical
|
|
|
|
* printer, or for creating a print preview.
|
|
|
|
*/
|
|
|
|
class nsPrintJob final : public nsIObserver,
|
|
|
|
public nsIWebProgressListener,
|
|
|
|
public nsSupportsWeakReference {
|
2002-08-21 16:01:05 +04:00
|
|
|
public:
|
2017-12-06 15:47:19 +03:00
|
|
|
static nsresult GetGlobalPrintSettings(nsIPrintSettings** aPrintSettings);
|
|
|
|
static void CloseProgressDialog(nsIWebProgressListener* aWebProgressListener);
|
|
|
|
|
2017-12-06 13:12:44 +03:00
|
|
|
nsPrintJob() = default;
|
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
// nsISupports interface...
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
// nsIObserver
|
|
|
|
NS_DECL_NSIOBSERVER
|
|
|
|
|
2012-09-04 17:29:27 +04:00
|
|
|
NS_DECL_NSIWEBPROGRESSLISTENER
|
|
|
|
|
2019-04-12 16:53:26 +03:00
|
|
|
// Our nsIWebBrowserPrint implementation defers to these methods.
|
|
|
|
nsresult Print(nsIPrintSettings* aPrintSettings,
|
|
|
|
nsIWebProgressListener* aWebProgressListener);
|
|
|
|
nsresult PrintPreview(nsIPrintSettings* aPrintSettings,
|
|
|
|
mozIDOMWindowProxy* aChildDOMWin,
|
|
|
|
nsIWebProgressListener* aWebProgressListener);
|
|
|
|
bool IsDoingPrint() const { return mIsDoingPrinting; }
|
|
|
|
bool IsDoingPrintPreview() const { return mIsDoingPrintPreview; }
|
|
|
|
bool IsFramesetDocument() const;
|
|
|
|
bool IsIFrameSelected();
|
|
|
|
bool IsRangeSelection();
|
|
|
|
bool IsFramesetFrameSelected() const;
|
|
|
|
/// If the returned value is not greater than zero, an error occurred.
|
|
|
|
int32_t GetPrintPreviewNumPages();
|
|
|
|
/// Callers are responsible for free'ing aResult.
|
|
|
|
nsresult EnumerateDocumentNames(uint32_t* aCount, char16_t*** aResult);
|
|
|
|
already_AddRefed<nsIPrintSettings> GetCurrentPrintSettings();
|
2006-03-30 04:27:42 +04:00
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
// This enum tells indicates what the default should be for the title
|
|
|
|
// if the title from the document is null
|
|
|
|
enum eDocTitleDefault { eDocTitleDefBlank, eDocTitleDefURLDoc };
|
|
|
|
|
|
|
|
void Destroy();
|
2002-09-10 05:57:09 +04:00
|
|
|
void DestroyPrintingData();
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2017-03-06 10:35:39 +03:00
|
|
|
nsresult Initialize(nsIDocumentViewerPrint* aDocViewerPrint,
|
2019-01-02 16:05:23 +03:00
|
|
|
nsIDocShell* aContainer,
|
|
|
|
mozilla::dom::Document* aDocument, float aScreenDPI);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
nsresult GetSeqFrameAndCountPages(nsIFrame*& aSeqFrame, int32_t& aCount);
|
2006-12-10 11:05:05 +03:00
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
//
|
|
|
|
// The following three methods are used for printing...
|
|
|
|
//
|
|
|
|
nsresult DocumentReadyForPrinting();
|
|
|
|
nsresult GetSelectionDocument(nsIDeviceContextSpec* aDevSpec,
|
2019-01-02 16:05:23 +03:00
|
|
|
mozilla::dom::Document** aNewDoc);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2006-12-10 11:05:05 +03:00
|
|
|
nsresult SetupToPrintContent();
|
2002-08-21 16:01:05 +04:00
|
|
|
nsresult EnablePOsForPrinting();
|
2002-09-20 01:45:07 +04:00
|
|
|
nsPrintObject* FindSmallestSTF();
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2017-03-06 11:28:20 +03:00
|
|
|
bool PrintDocContent(const mozilla::UniquePtr<nsPrintObject>& aPO,
|
|
|
|
nsresult& aStatus);
|
|
|
|
nsresult DoPrint(const mozilla::UniquePtr<nsPrintObject>& aPO);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
void SetPrintPO(nsPrintObject* aPO, bool aPrint);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
void TurnScriptingOn(bool aDoTurnOn);
|
|
|
|
bool CheckDocumentForPPCaching();
|
2002-08-21 16:01:05 +04:00
|
|
|
void InstallPrintPreviewListener();
|
|
|
|
|
|
|
|
// nsIDocumentViewerPrint Printing Methods
|
2012-08-31 04:24:35 +04:00
|
|
|
bool HasPrintCallbackCanvas();
|
|
|
|
bool PrePrintPage();
|
2011-09-29 10:19:26 +04:00
|
|
|
bool PrintPage(nsPrintObject* aPOect, bool& aInRange);
|
|
|
|
bool DonePrintingPages(nsPrintObject* aPO, nsresult aResult);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
2014-01-07 02:34:15 +04:00
|
|
|
void BuildDocTree(nsIDocShell* aParentNode,
|
2009-02-03 17:42:18 +03:00
|
|
|
nsTArray<nsPrintObject*>* aDocList,
|
2017-03-06 11:28:20 +03:00
|
|
|
const mozilla::UniquePtr<nsPrintObject>& aPO);
|
|
|
|
nsresult ReflowDocList(const mozilla::UniquePtr<nsPrintObject>& aPO,
|
|
|
|
bool aSetPixelScale);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2019-04-13 15:43:57 +03:00
|
|
|
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
2017-03-06 11:28:20 +03:00
|
|
|
nsresult ReflowPrintObject(const mozilla::UniquePtr<nsPrintObject>& aPO);
|
2006-03-30 04:27:42 +04:00
|
|
|
|
2017-03-06 11:28:20 +03:00
|
|
|
void CheckForChildFrameSets(const mozilla::UniquePtr<nsPrintObject>& aPO);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
void CalcNumPrintablePages(int32_t& aNumPages);
|
2011-09-29 10:19:26 +04:00
|
|
|
void ShowPrintProgress(bool aIsForPrinting, bool& aDoNotify);
|
|
|
|
nsresult CleanupOnFailure(nsresult aResult, bool aIsPrinting);
|
2007-11-10 01:38:46 +03:00
|
|
|
// If FinishPrintPreview() fails, caller may need to reset the state of the
|
|
|
|
// object, for example by calling CleanupOnFailure().
|
2002-08-21 16:01:05 +04:00
|
|
|
nsresult FinishPrintPreview();
|
2017-03-06 11:28:20 +03:00
|
|
|
void SetDocAndURLIntoProgress(const mozilla::UniquePtr<nsPrintObject>& aPO,
|
2002-08-21 16:01:05 +04:00
|
|
|
nsIPrintProgressParams* aParams);
|
2013-07-24 15:48:37 +04:00
|
|
|
void EllipseLongString(nsAString& aStr, const uint32_t aLen, bool aDoFront);
|
2007-05-06 15:29:41 +04:00
|
|
|
nsresult CheckForPrinters(nsIPrintSettings* aPrintSettings);
|
2014-01-04 19:02:17 +04:00
|
|
|
void CleanupDocTitleArray(char16_t**& aArray, int32_t& aCount);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2016-01-30 20:05:36 +03:00
|
|
|
bool IsThereARangeSelection(nsPIDOMWindowOuter* aDOMWin);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2015-09-16 23:12:43 +03:00
|
|
|
void FirePrintingErrorEvent(nsresult aPrintError);
|
2002-08-21 16:01:05 +04:00
|
|
|
//---------------------------------------------------------------------
|
|
|
|
|
|
|
|
// Timer Methods
|
2017-03-06 11:28:20 +03:00
|
|
|
nsresult StartPagePrintTimer(const mozilla::UniquePtr<nsPrintObject>& aPO);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2019-04-12 16:53:26 +03:00
|
|
|
bool IsWindowsInOurSubTree(nsPIDOMWindowOuter* aDOMWindow) const;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool IsThereAnIFrameSelected(nsIDocShell* aDocShell,
|
2016-01-30 20:05:36 +03:00
|
|
|
nsPIDOMWindowOuter* aDOMWin,
|
|
|
|
bool& aIsParentFrameSet);
|
2002-08-21 16:01:05 +04:00
|
|
|
|
|
|
|
// get the currently infocus frame for the document viewer
|
2019-04-12 16:53:26 +03:00
|
|
|
already_AddRefed<nsPIDOMWindowOuter> FindFocusedDOMWindow() const;
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2017-03-06 11:28:20 +03:00
|
|
|
void GetDisplayTitleAndURL(const mozilla::UniquePtr<nsPrintObject>& aPO,
|
2013-07-24 15:48:37 +04:00
|
|
|
nsAString& aTitle, nsAString& aURLStr,
|
|
|
|
eDocTitleDefault aDefType);
|
2004-02-01 15:10:57 +03:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool CheckBeforeDestroy();
|
2002-08-21 16:01:05 +04:00
|
|
|
nsresult Cancelled();
|
|
|
|
|
2019-04-16 10:25:10 +03:00
|
|
|
mozilla::PresShell* GetPrintPreviewPresShell() {
|
2009-09-03 08:26:00 +04:00
|
|
|
return mPrtPreview->mPrintObject->mPresShell;
|
|
|
|
}
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2008-01-29 23:14:51 +03:00
|
|
|
float GetPrintPreviewScale() {
|
|
|
|
return mPrtPreview->mPrintObject->mPresContext->GetPrintPreviewScale();
|
|
|
|
}
|
2017-03-06 10:35:39 +03:00
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
// These calls also update the DocViewer
|
2011-09-29 10:19:26 +04:00
|
|
|
void SetIsPrinting(bool aIsPrinting);
|
2004-01-28 14:17:14 +03:00
|
|
|
bool GetIsPrinting() { return mIsDoingPrinting; }
|
2011-09-29 10:19:26 +04:00
|
|
|
void SetIsPrintPreview(bool aIsPrintPreview);
|
2004-01-28 14:17:14 +03:00
|
|
|
bool GetIsPrintPreview() { return mIsDoingPrintPreview; }
|
2011-09-29 10:19:26 +04:00
|
|
|
bool GetIsCreatingPrintPreview() { return mIsCreatingPrintPreview; }
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2013-01-29 08:59:55 +04:00
|
|
|
void SetDisallowSelectionPrint(bool aDisallowSelectionPrint) {
|
|
|
|
mDisallowSelectionPrint = aDisallowSelectionPrint;
|
|
|
|
}
|
|
|
|
|
2017-12-04 20:44:17 +03:00
|
|
|
private:
|
|
|
|
nsPrintJob& operator=(const nsPrintJob& aOther) = delete;
|
|
|
|
|
|
|
|
~nsPrintJob();
|
2007-02-23 06:58:36 +03:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult CommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
|
2009-12-11 07:02:13 +03:00
|
|
|
nsIWebProgressListener* aWebProgressListener,
|
2019-01-02 16:05:23 +03:00
|
|
|
mozilla::dom::Document* aDoc);
|
2007-02-23 06:58:36 +03:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult DoCommonPrint(bool aIsPrintPreview, nsIPrintSettings* aPrintSettings,
|
2009-12-11 07:02:13 +03:00
|
|
|
nsIWebProgressListener* aWebProgressListener,
|
2019-01-02 16:05:23 +03:00
|
|
|
mozilla::dom::Document* aDoc);
|
2007-02-23 06:58:36 +03:00
|
|
|
|
2002-08-21 16:01:05 +04:00
|
|
|
void FirePrintCompletionEvent();
|
2006-03-30 04:27:42 +04:00
|
|
|
|
2017-01-03 14:10:11 +03:00
|
|
|
void DisconnectPagePrintTimer();
|
|
|
|
|
2017-12-04 20:44:17 +03:00
|
|
|
nsresult AfterNetworkPrint(bool aHandleError);
|
|
|
|
|
|
|
|
nsresult SetRootView(nsPrintObject* aPO, bool& aDoReturn,
|
|
|
|
bool& aDocumentIsTopLevel, nsSize& aAdjSize);
|
|
|
|
nsView* GetParentViewForRoot();
|
|
|
|
bool DoSetPixelScale();
|
|
|
|
void UpdateZoomRatio(nsPrintObject* aPO, bool aSetPixelScale);
|
2019-04-13 15:43:57 +03:00
|
|
|
MOZ_CAN_RUN_SCRIPT_BOUNDARY
|
2017-12-04 20:44:17 +03:00
|
|
|
nsresult ReconstructAndReflow(bool aDoSetPixelScale);
|
|
|
|
nsresult UpdateSelectionAndShrinkPrintObject(nsPrintObject* aPO,
|
|
|
|
bool aDocumentIsTopLevel);
|
|
|
|
nsresult InitPrintDocConstruction(bool aHandleError);
|
|
|
|
void FirePrintPreviewUpdateEvent();
|
|
|
|
|
|
|
|
void PageDone(nsresult aResult);
|
|
|
|
|
2019-01-03 21:27:37 +03:00
|
|
|
RefPtr<mozilla::dom::Document> mDocument;
|
2017-12-25 06:07:43 +03:00
|
|
|
nsCOMPtr<nsIDocumentViewerPrint> mDocViewerPrint;
|
2017-12-06 13:12:44 +03:00
|
|
|
|
|
|
|
nsWeakPtr mContainer;
|
|
|
|
WeakFrame mPageSeqFrame;
|
2017-03-06 10:35:39 +03:00
|
|
|
|
2017-05-09 11:08:20 +03:00
|
|
|
// 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
|
2017-12-04 20:44:17 +03:00
|
|
|
// could conceivably destroy this nsPrintJob owner object and all its
|
2017-05-09 11:08:20 +03:00
|
|
|
// member-data.
|
|
|
|
RefPtr<nsPrintData> mPrt;
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2017-12-25 06:07:43 +03:00
|
|
|
// Print Preview
|
|
|
|
RefPtr<nsPrintData> mPrtPreview;
|
|
|
|
RefPtr<nsPrintData> mOldPrtPreview;
|
2017-12-06 13:12:44 +03:00
|
|
|
|
2017-12-06 13:12:44 +03:00
|
|
|
nsPagePrintTimer* mPagePrintTimer = nullptr;
|
|
|
|
|
|
|
|
float mScreenDPI = 115.0f;
|
|
|
|
int32_t mLoadCounter = 0;
|
2002-08-21 16:01:05 +04:00
|
|
|
|
2017-12-06 13:12:44 +03:00
|
|
|
bool mIsCreatingPrintPreview = false;
|
|
|
|
bool mIsDoingPrinting = false;
|
|
|
|
bool mIsDoingPrintPreview = false;
|
|
|
|
bool mProgressDialogIsShown = false;
|
|
|
|
bool mDidLoadDataForPrinting = false;
|
|
|
|
bool mIsDestroying = false;
|
|
|
|
bool mDisallowSelectionPrint = false;
|
2002-08-21 16:01:05 +04:00
|
|
|
};
|
|
|
|
|
2017-12-04 20:44:17 +03:00
|
|
|
#endif // nsPrintJob_h
|