Bug 1553080. Have nsPrintJob record modality and mozPrintCallback presence during initialization. r=bobowen

Differential Revision: https://phabricator.services.mozilla.com/D31974

--HG--
extra : rebase_source : 4e5319b1f6b3b7a70dd79d8c9538300ca1ccd581
extra : amend_source : a4510ba02336f5464463fec3ccd320296d74df92
This commit is contained in:
Jonathan Watt 2019-05-10 14:52:25 +01:00
parent e0e310caed
commit e8b9c5bc5d
2 changed files with 62 additions and 61 deletions

View File

@ -498,6 +498,37 @@ static nsresult EnsureSettingsHasPrinterNameSet(
#endif
}
static bool DocHasPrintCallbackCanvas(Document* aDoc, void* aData) {
if (!aDoc) {
return true;
}
Element* root = aDoc->GetRootElement();
if (!root) {
return true;
}
RefPtr<nsContentList> canvases =
NS_GetContentList(root, kNameSpaceID_XHTML, NS_LITERAL_STRING("canvas"));
uint32_t canvasCount = canvases->Length(true);
for (uint32_t i = 0; i < canvasCount; ++i) {
HTMLCanvasElement* canvas =
HTMLCanvasElement::FromNodeOrNull(canvases->Item(i, false));
if (canvas && canvas->GetMozPrintCallback()) {
// This subdocument has a print callback. Set result and return false to
// stop iteration.
*static_cast<bool*>(aData) = true;
return false;
}
}
return true;
}
static bool AnySubdocHasPrintCallbackCanvas(Document* aDoc) {
bool result = false;
aDoc->EnumerateSubDocuments(&DocHasPrintCallbackCanvas,
static_cast<void*>(&result));
return result;
}
//-------------------------------------------------------
NS_IMPL_ISUPPORTS(nsPrintJob, nsIWebProgressListener, nsISupportsWeakReference,
@ -550,6 +581,23 @@ nsresult nsPrintJob::Initialize(nsIDocumentViewerPrint* aDocViewerPrint,
// here instead.
mOriginalDoc = aOriginalDoc;
// Anything state that we need from aOriginalDoc must be fetched and stored
// here, since the document that the user selected to print may mutate
// across consecutive PrintPreview() calls.
nsCOMPtr<nsIDocShellTreeOwner> owner;
aDocShell->GetTreeOwner(getter_AddRefs(owner));
nsCOMPtr<nsIWebBrowserChrome> browserChrome = do_GetInterface(owner);
if (browserChrome) {
browserChrome->IsWindowModal(&mIsForModalWindow);
}
bool hasMozPrintCallback = false;
DocHasPrintCallbackCanvas(aOriginalDoc,
static_cast<void*>(&hasMozPrintCallback));
mHasMozPrintCallback =
hasMozPrintCallback || AnySubdocHasPrintCallbackCanvas(aOriginalDoc);
return NS_OK;
}
@ -1215,23 +1263,15 @@ void nsPrintJob::ShowPrintProgress(bool aIsForPrinting, bool& aDoNotify) {
nsCOMPtr<nsIPrintingPromptService> printPromptService(
do_GetService(kPrintingPromptService));
if (printPromptService) {
nsPIDOMWindowOuter* domWin = mOriginalDoc->GetWindow();
if (!domWin) return;
nsCOMPtr<nsIDocShell> docShell = domWin->GetDocShell();
if (!docShell) return;
nsCOMPtr<nsIDocShellTreeOwner> owner;
docShell->GetTreeOwner(getter_AddRefs(owner));
nsCOMPtr<nsIWebBrowserChrome> browserChrome = do_GetInterface(owner);
if (!browserChrome) return;
bool isModal = true;
browserChrome->IsWindowModal(&isModal);
if (isModal) {
if (mIsForModalWindow) {
// Showing a print progress dialog when printing a modal window
// isn't supported. See bug 301560.
return;
}
nsPIDOMWindowOuter* domWin = mOriginalDoc->GetWindow();
if (!domWin) return;
nsCOMPtr<nsIWebProgressListener> printProgressListener;
nsCOMPtr<nsIWebBrowserPrint> wbp(do_QueryInterface(mDocViewerPrint));
@ -2580,53 +2620,6 @@ void nsPrintJob::EllipseLongString(nsAString& aStr, const uint32_t aLen,
}
}
static bool DocHasPrintCallbackCanvas(Document* aDoc, void* aData) {
if (!aDoc) {
return true;
}
Element* root = aDoc->GetRootElement();
if (!root) {
return true;
}
RefPtr<nsContentList> canvases =
NS_GetContentList(root, kNameSpaceID_XHTML, NS_LITERAL_STRING("canvas"));
uint32_t canvasCount = canvases->Length(true);
for (uint32_t i = 0; i < canvasCount; ++i) {
HTMLCanvasElement* canvas =
HTMLCanvasElement::FromNodeOrNull(canvases->Item(i, false));
if (canvas && canvas->GetMozPrintCallback()) {
// This subdocument has a print callback. Set result and return false to
// stop iteration.
*static_cast<bool*>(aData) = true;
return false;
}
}
return true;
}
static bool DocHasPrintCallbackCanvas(Document* aDoc) {
bool result = false;
aDoc->EnumerateSubDocuments(&DocHasPrintCallbackCanvas,
static_cast<void*>(&result));
return result;
}
/**
* Checks to see if the document this print engine is associated with has any
* canvases that have a mozPrintCallback.
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement#Properties
*/
bool nsPrintJob::HasPrintCallbackCanvas() {
if (!mOriginalDoc) {
return false;
}
// First check this mOriginalDoc.
bool result = false;
DocHasPrintCallbackCanvas(mOriginalDoc, static_cast<void*>(&result));
// Also check the sub documents.
return result || DocHasPrintCallbackCanvas(mOriginalDoc);
}
//-------------------------------------------------------
bool nsPrintJob::PrePrintPage() {
NS_ASSERTION(mPageSeqFrame.IsAlive(), "mPageSeqFrame is not alive!");

View File

@ -159,8 +159,14 @@ class nsPrintJob final : public nsIObserver,
*/
void SuppressPrintPreviewUserEvents();
// nsIDocumentViewerPrint Printing Methods
bool HasPrintCallbackCanvas();
// nsIDocumentViewerPrint Printing Methods:
/**
* Checks to see if the document this print engine is associated with has any
* canvases that have a mozPrintCallback.
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement#Properties
*/
bool HasPrintCallbackCanvas() { return mHasMozPrintCallback; }
bool PrePrintPage();
bool PrintPage(nsPrintObject* aPOect, bool& aInRange);
bool DonePrintingPages(nsPrintObject* aPO, nsresult aResult);
@ -309,6 +315,8 @@ class nsPrintJob final : public nsIObserver,
bool mDidLoadDataForPrinting = false;
bool mIsDestroying = false;
bool mDisallowSelectionPrint = false;
bool mIsForModalWindow = false;
bool mHasMozPrintCallback = false;
};
#endif // nsPrintJob_h