mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
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:
parent
e0e310caed
commit
e8b9c5bc5d
@ -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!");
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user