gecko-dev/layout/printing/nsPrintData.cpp
Daniel Holbert 06a402acb0 Bug 1661868 part 2: Unify page-range handling logic, to assume all PrintedSheetFrames should be printed (and let them manage page-range-based skipping during layout). r=TYLin
This patch does the following things:

(1) It removes the legacy page-range-handling function
"DetermineWhetherToPrintPage()", and it now will always print every
PrintedSheetFrame.

(2) It activates PrintedSheetFrame's page-range handling function so that it
can take over responsibility for skipping pages during print operations.

(3) It adjusts the nsPrintJob code that kicks off individual asynchronous
"print the next page" operations (which is now really "print the next
PrintedSheetFrame).  This nsPrintJob code used to have page-range-related
handling interwoven into it, and that handling isn't necessary anymore now that
we're handling page-skipping up front at layout time.

(4) It replaces the mPageNum member-var (which tracks which page we're about to
print or are currently printing) with mCurrentSheetIdx, which is now a 0-based
index into the list of PrintedSheetFrame instances.

(5) It removes nsPrintData:mNumPagesPrinted, which was only used for
progress-bar-completion updates & which basically tracked the same information
that I'm tracking in the new mCurrentSheetIdx variable.

There's some additional cleanup that we should do after this lands (e.g. some
s/page/sheet/ renamings) but I'm holding off on that for now, to keep this
patch relatively targeted.

Differential Revision: https://phabricator.services.mozilla.com/D92660
2020-10-07 20:51:56 +00:00

111 lines
3.5 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/. */
#include "nsPrintData.h"
#include "nsIPrintProgressParams.h"
#include "nsIStringBundle.h"
#include "nsIWidget.h"
#include "nsPrintObject.h"
#include "nsIWebProgressListener.h"
#include "mozilla/Services.h"
//-----------------------------------------------------
// PR LOGGING
#include "mozilla/Logging.h"
extern mozilla::LazyLogModule gPrintingLog;
#define PR_PL(_p1) MOZ_LOG(gPrintingLog, mozilla::LogLevel::Debug, _p1);
//---------------------------------------------------
//-- nsPrintData Class Impl
//---------------------------------------------------
nsPrintData::nsPrintData(ePrintDataType aType)
: mType(aType),
mPrintDocList(0),
mIsParentAFrameSet(false),
mOnStartSent(false),
mIsAborted(false),
mPreparingForPrint(false),
mShrinkToFit(false),
mNumPrintablePages(0),
mShrinkRatio(1.0) {}
nsPrintData::~nsPrintData() {
// Only Send an OnEndPrinting if we have started printing
if (mOnStartSent && mType != eIsPrintPreview) {
OnEndPrinting();
}
if (mPrintDC) {
PR_PL(("****************** End Document ************************\n"));
PR_PL(("\n"));
bool isCancelled = false;
mPrintSettings->GetIsCancelled(&isCancelled);
nsresult rv = NS_OK;
if (mType == eIsPrinting && mPrintDC->IsCurrentlyPrintingDocument()) {
if (!isCancelled && !mIsAborted) {
rv = mPrintDC->EndDocument();
} else {
rv = mPrintDC->AbortDocument();
}
if (NS_FAILED(rv)) {
// XXX nsPrintData::ShowPrintErrorDialog(rv);
}
}
}
}
void nsPrintData::OnStartPrinting() {
if (!mOnStartSent) {
DoOnProgressChange(0, 0, true,
nsIWebProgressListener::STATE_START |
nsIWebProgressListener::STATE_IS_DOCUMENT |
nsIWebProgressListener::STATE_IS_NETWORK);
mOnStartSent = true;
}
}
void nsPrintData::OnEndPrinting() {
DoOnProgressChange(100, 100, true,
nsIWebProgressListener::STATE_STOP |
nsIWebProgressListener::STATE_IS_DOCUMENT);
DoOnProgressChange(100, 100, true,
nsIWebProgressListener::STATE_STOP |
nsIWebProgressListener::STATE_IS_NETWORK);
}
void nsPrintData::DoOnProgressChange(int32_t aProgress, int32_t aMaxProgress,
bool aDoStartStop, int32_t aFlag) {
size_t numberOfListeners = mPrintProgressListeners.Length();
for (size_t i = 0; i < numberOfListeners; ++i) {
nsCOMPtr<nsIWebProgressListener> listener =
mPrintProgressListeners.SafeElementAt(i);
if (NS_WARN_IF(!listener)) {
continue;
}
listener->OnProgressChange(nullptr, nullptr, aProgress, aMaxProgress,
aProgress, aMaxProgress);
if (aDoStartStop) {
listener->OnStateChange(nullptr, nullptr, aFlag, NS_OK);
}
}
}
void nsPrintData::DoOnStatusChange(nsresult aStatus) {
size_t numberOfListeners = mPrintProgressListeners.Length();
for (size_t i = 0; i < numberOfListeners; ++i) {
nsCOMPtr<nsIWebProgressListener> listener =
mPrintProgressListeners.SafeElementAt(i);
if (NS_WARN_IF(!listener)) {
continue;
}
listener->OnStatusChange(nullptr, nullptr, aStatus, nullptr);
}
}