nsresult PrintingParent::ShowPrintDialog(PBrowserParent* aParent, const PrintData& aData, PrintData* aResult) { nsCOMPtr<nsPIDOMWindowOuter> parentWin = DOMWindowFromBrowserParent(aParent); if (!parentWin) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIPrintingPromptService> pps(do_GetService("@mozilla.org/embedcomp/printingprompt-service;1")); if (!pps) { return NS_ERROR_FAILURE; } // The initSettings we got can be wrapped using // PrintDataUtils' MockWebBrowserPrint, which implements enough of // nsIWebBrowserPrint to keep the dialogs happy. nsCOMPtr<nsIWebBrowserPrint> wbp = new MockWebBrowserPrint(aData); nsCOMPtr<nsIPrintSettings> settings; nsresult rv = mPrintSettingsSvc->GetNewPrintSettings(getter_AddRefs(settings)); NS_ENSURE_SUCCESS(rv, rv); rv = mPrintSettingsSvc->DeserializeToPrintSettings(aData, settings); NS_ENSURE_SUCCESS(rv, rv); rv = pps->ShowPrintDialog(parentWin, wbp, settings); NS_ENSURE_SUCCESS(rv, rv); // Serialize back to aResult. Use the existing RemotePrintJob if we have one // otherwise SerializeAndEnsureRemotePrintJob() will create a new one. RemotePrintJobParent* remotePrintJob = static_cast<RemotePrintJobParent*>(aData.remotePrintJobParent()); rv = SerializeAndEnsureRemotePrintJob(settings, nullptr, remotePrintJob, aResult); return rv; }
nsresult PrintingParent::ShowPrintDialog(PBrowserParent* aParent, const PrintData& aData, PrintData* aResult) { // If aParent is null this call is just being used to get print settings from // the printer for print preview. bool isPrintPreview = !aParent; nsCOMPtr<nsPIDOMWindowOuter> parentWin; if (aParent) { parentWin = DOMWindowFromBrowserParent(aParent); if (!parentWin) { return NS_ERROR_FAILURE; } } nsCOMPtr<nsIPrintingPromptService> pps(do_GetService("@mozilla.org/embedcomp/printingprompt-service;1")); if (!pps) { return NS_ERROR_FAILURE; } // The initSettings we got can be wrapped using // PrintDataUtils' MockWebBrowserPrint, which implements enough of // nsIWebBrowserPrint to keep the dialogs happy. nsCOMPtr<nsIWebBrowserPrint> wbp = new MockWebBrowserPrint(aData); // Use the existing RemotePrintJob and its settings, if we have one, to make // sure they stay current. RemotePrintJobParent* remotePrintJob = static_cast<RemotePrintJobParent*>(aData.remotePrintJobParent()); nsCOMPtr<nsIPrintSettings> settings; nsresult rv; if (remotePrintJob) { settings = remotePrintJob->GetPrintSettings(); } else { rv = mPrintSettingsSvc->GetNewPrintSettings(getter_AddRefs(settings)); NS_ENSURE_SUCCESS(rv, rv); } // We only want to use the print silently setting from the parent. bool printSilently; rv = settings->GetPrintSilent(&printSilently); NS_ENSURE_SUCCESS(rv, rv); rv = mPrintSettingsSvc->DeserializeToPrintSettings(aData, settings); NS_ENSURE_SUCCESS(rv, rv); rv = settings->SetPrintSilent(printSilently); NS_ENSURE_SUCCESS(rv, rv); // If this is for print preview or we are printing silently then we just need // to initialize the print settings with anything specific from the printer. if (isPrintPreview || printSilently || Preferences::GetBool("print.always_print_silent", printSilently)) { nsXPIDLString printerName; rv = settings->GetPrinterName(getter_Copies(printerName)); NS_ENSURE_SUCCESS(rv, rv); settings->SetIsInitializedFromPrinter(false); mPrintSettingsSvc->InitPrintSettingsFromPrinter(printerName, settings); } else { rv = pps->ShowPrintDialog(parentWin, wbp, settings); NS_ENSURE_SUCCESS(rv, rv); } if (isPrintPreview) { // For print preview we don't want a RemotePrintJob just the settings. rv = mPrintSettingsSvc->SerializeToPrintData(settings, nullptr, aResult); } else { rv = SerializeAndEnsureRemotePrintJob(settings, nullptr, remotePrintJob, aResult); } return rv; }