diff options
Diffstat (limited to 'src/core/printing/print_view_manager_qt.cpp')
-rw-r--r-- | src/core/printing/print_view_manager_qt.cpp | 165 |
1 files changed, 120 insertions, 45 deletions
diff --git a/src/core/printing/print_view_manager_qt.cpp b/src/core/printing/print_view_manager_qt.cpp index 627afb01a..ff9fc76be 100644 --- a/src/core/printing/print_view_manager_qt.cpp +++ b/src/core/printing/print_view_manager_qt.cpp @@ -44,6 +44,8 @@ #include "print_view_manager_qt.h" #include "type_conversion.h" +#include "web_contents_adapter_client.h" +#include "web_contents_view_qt.h" #include "web_engine_context.h" #include <QtGui/qpagelayout.h> @@ -51,10 +53,12 @@ #include "base/values.h" #include "base/memory/ref_counted_memory.h" +#include "base/task_scheduler/post_task.h" #include "chrome/browser/printing/print_job_manager.h" #include "chrome/browser/printing/printer_query.h" #include "components/printing/common/print_messages.h" #include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/web_preferences.h" @@ -65,6 +69,7 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(QtWebEngineCore::PrintViewManagerQt); namespace { + static const qreal kMicronsToMillimeter = 1000.0f; static std::vector<char> @@ -84,11 +89,10 @@ GetStdVectorFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) static scoped_refptr<base::RefCountedBytes> GetBytesFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) { - std::unique_ptr<base::SharedMemory> shared_buf( - new base::SharedMemory(handle, true)); + std::unique_ptr<base::SharedMemory> shared_buf(new base::SharedMemory(handle, true)); if (!shared_buf->Map(data_size)) { - return NULL; + return nullptr; } unsigned char* data = static_cast<unsigned char*>(shared_buf->memory()); @@ -98,14 +102,13 @@ GetBytesFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) // Write the PDF file to disk. static void SavePdfFile(scoped_refptr<base::RefCountedBytes> data, - const base::FilePath& path, - const QtWebEngineCore::PrintViewManagerQt::PrintToPDFFileCallback - &saveCallback) + const base::FilePath &path, + const QtWebEngineCore::PrintViewManagerQt::PrintToPDFFileCallback &saveCallback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); + base::AssertBlockingAllowed(); DCHECK_GT(data->size(), 0U); - printing::PdfMetafileSkia metafile(printing::SkiaDocumentType::PDF); + printing::PdfMetafileSkia metafile; metafile.InitFromData(static_cast<const void*>(data->front()), data->size()); base::File file(path, @@ -131,16 +134,13 @@ static base::DictionaryValue *createPrintSettings() printSettings->SetBoolean(printing::kSettingPrintWithPrivet, false); printSettings->SetBoolean(printing::kSettingPrintWithExtension, false); - printSettings->SetBoolean(printing::kSettingGenerateDraftData, false); - printSettings->SetBoolean(printing::kSettingPreviewModifiable, false); - printSettings->SetInteger(printing::kSettingDpiHorizontal, printing::kPointsPerInch); printSettings->SetInteger(printing::kSettingDpiVertical, printing::kPointsPerInch); printSettings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX); printSettings->SetInteger(printing::kSettingCopies, 1); printSettings->SetBoolean(printing::kSettingCollate, false); - printSettings->SetBoolean(printing::kSettingGenerateDraftData, false); +// printSettings->SetBoolean(printing::kSettingGenerateDraftData, false); printSettings->SetBoolean(printing::kSettingPreviewModifiable, false); printSettings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false); @@ -196,11 +196,23 @@ static base::DictionaryValue *createPrintSettingsFromQPageLayout(const QPageLayo namespace QtWebEngineCore { +struct PrintViewManagerQt::FrameDispatchHelper { + PrintViewManagerQt* m_manager; + content::RenderFrameHost* m_renderFrameHost; + + bool Send(IPC::Message* msg) { + return m_renderFrameHost->Send(msg); + } + + void OnSetupScriptedPrintPreview(IPC::Message* reply_msg) { + m_manager->OnSetupScriptedPrintPreview(m_renderFrameHost, reply_msg); + } +}; + PrintViewManagerQt::~PrintViewManagerQt() { } -#if BUILDFLAG(ENABLE_BASIC_PRINTING) void PrintViewManagerQt::PrintToPDFFileWithCallback(const QPageLayout &pageLayout, bool printInColor, const QString &filePath, @@ -210,8 +222,7 @@ void PrintViewManagerQt::PrintToPDFFileWithCallback(const QPageLayout &pageLayou return; if (m_printSettings || !filePath.length()) { - content::BrowserThread::PostTask(content::BrowserThread::UI, - FROM_HERE, + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::Bind(callback, false)); return; } @@ -219,8 +230,7 @@ void PrintViewManagerQt::PrintToPDFFileWithCallback(const QPageLayout &pageLayou m_pdfOutputPath = toFilePath(filePath); m_pdfSaveCallback = callback; if (!PrintToPDFInternal(pageLayout, printInColor)) { - content::BrowserThread::PostTask(content::BrowserThread::UI, - FROM_HERE, + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::Bind(callback, false)); resetPdfState(); } @@ -236,9 +246,8 @@ void PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, // If there already is a pending print in progress, don't try starting another one. if (m_printSettings) { - content::BrowserThread::PostTask(content::BrowserThread::UI, - FROM_HERE, - base::Bind(callback, std::vector<char>())); + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(callback, std::vector<char>())); return; } @@ -260,39 +269,68 @@ bool PrintViewManagerQt::PrintToPDFInternal(const QPageLayout &pageLayout, return false; m_printSettings.reset(createPrintSettingsFromQPageLayout(pageLayout, useCustomMargins)); - m_printSettings->SetBoolean(printing::kSettingShouldPrintBackgrounds - , web_contents()->GetRenderViewHost()->GetWebkitPreferences().should_print_backgrounds); + m_printSettings->SetBoolean(printing::kSettingShouldPrintBackgrounds, + web_contents()->GetRenderViewHost()-> + GetWebkitPreferences().should_print_backgrounds); m_printSettings->SetInteger(printing::kSettingColor, printInColor ? printing::COLOR : printing::GRAYSCALE); - return web_contents()->GetMainFrame()->Send( - new PrintMsg_InitiatePrintPreview(web_contents()->GetMainFrame()->GetRoutingID(), false)); -} -#endif // BUILDFLAG(ENABLE_BASIC_PRINTING) + if (web_contents()->ShowingInterstitialPage() || web_contents()->IsCrashed()) + return false; + + content::RenderFrameHost* rfh = web_contents()->GetMainFrame(); + auto message = std::make_unique<PrintMsg_InitiatePrintPreview>( + rfh->GetRoutingID(), false); + + DCHECK(!m_printPreviewRfh); + + if (!rfh->Send(message.release())) { + return false; + } + + m_printPreviewRfh = rfh; + return true; +} // PrintedPagesSource implementation. base::string16 PrintViewManagerQt::RenderSourceName() { - return toString16(QLatin1String("")); + return base::string16(); } PrintViewManagerQt::PrintViewManagerQt(content::WebContents *contents) : PrintViewManagerBaseQt(contents) + , m_printPreviewRfh(nullptr) { } // content::WebContentsObserver implementation. -bool PrintViewManagerQt::OnMessageReceived(const IPC::Message& message, content::RenderFrameHost* render_frame_host) +bool PrintViewManagerQt::OnMessageReceived(const IPC::Message& message, + content::RenderFrameHost* render_frame_host) { + FrameDispatchHelper helper = {this, render_frame_host}; bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PrintViewManagerQt, message) - IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog) - IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, OnRequestPrintPreview) - IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting, OnMetafileReadyForPrinting); - IPC_MESSAGE_UNHANDLED(handled = false) + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintViewManagerQt, message, render_frame_host); + IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog) + IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, OnRequestPrintPreview) + IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting, OnMetafileReadyForPrinting); + IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, OnDidPreviewPage) + IPC_MESSAGE_FORWARD_DELAY_REPLY( + PrintHostMsg_SetupScriptedPrintPreview, &helper, + FrameDispatchHelper::OnSetupScriptedPrintPreview) + IPC_MESSAGE_HANDLER(PrintHostMsg_ShowScriptedPrintPreview, + OnShowScriptedPrintPreview) + IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() - return handled || PrintManager::OnMessageReceived(message, render_frame_host); + return handled || PrintViewManagerBaseQt::OnMessageReceived(message, render_frame_host); +} + +void PrintViewManagerQt::RenderFrameDeleted(content::RenderFrameHost *render_frame_host) +{ + if (render_frame_host == m_printPreviewRfh) + PrintPreviewDone(); + PrintViewManagerBaseQt::RenderFrameDeleted(render_frame_host); } void PrintViewManagerQt::resetPdfState() @@ -308,13 +346,14 @@ void PrintViewManagerQt::resetPdfState() void PrintViewManagerQt::OnRequestPrintPreview( const PrintHostMsg_RequestPrintPreview_Params &/*params*/) { - auto *rfh = web_contents()->GetMainFrame(); - rfh->Send(new PrintMsg_PrintPreview(rfh->GetRoutingID(), *m_printSettings)); - rfh->Send(new PrintMsg_ClosePrintPreviewDialog(rfh->GetRoutingID())); + m_printPreviewRfh->Send(new PrintMsg_PrintPreview(m_printPreviewRfh->GetRoutingID(), + *m_printSettings)); + PrintPreviewDone(); } -void PrintViewManagerQt::OnMetafileReadyForPrinting( - const PrintHostMsg_DidPreviewDocument_Params& params) +void PrintViewManagerQt::OnMetafileReadyForPrinting(content::RenderFrameHost* rfh, + const PrintHostMsg_DidPreviewDocument_Params& params, + const PrintHostMsg_PreviewIds &ids) { StopWorker(params.document_cookie); @@ -326,17 +365,16 @@ void PrintViewManagerQt::OnMetafileReadyForPrinting( resetPdfState(); if (!pdf_print_callback.is_null()) { - std::vector<char> data_vector = GetStdVectorFromHandle(params.metafile_data_handle, - params.data_size); + std::vector<char> data_vector = GetStdVectorFromHandle(params.content.metafile_data_handle, + params.content.data_size); content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::Bind(pdf_print_callback, data_vector)); } else { scoped_refptr<base::RefCountedBytes> data_bytes - = GetBytesFromHandle(params.metafile_data_handle, params.data_size); - content::BrowserThread::PostTask(content::BrowserThread::FILE, - FROM_HERE, - base::Bind(&SavePdfFile, data_bytes, pdfOutputPath, pdf_save_callback)); + = GetBytesFromHandle(params.content.metafile_data_handle, params.content.data_size); + base::PostTaskWithTraits(FROM_HERE, {base::MayBlock()}, + base::BindOnce(&SavePdfFile, data_bytes, pdfOutputPath, pdf_save_callback)); } } @@ -359,6 +397,7 @@ void PrintViewManagerQt::NavigationStopped() base::Bind(m_pdfPrintCallback, std::vector<char>())); } resetPdfState(); + PrintViewManagerBaseQt::NavigationStopped(); } void PrintViewManagerQt::RenderProcessGone(base::TerminationStatus status) @@ -372,5 +411,41 @@ void PrintViewManagerQt::RenderProcessGone(base::TerminationStatus status) resetPdfState(); } +void PrintViewManagerQt::OnDidPreviewPage(content::RenderFrameHost* rfh, + const PrintHostMsg_DidPreviewPage_Params& params, + const PrintHostMsg_PreviewIds& ids) +{ + // just consume the message, this is just for sending 'page-preview-ready' for webui +} + +void PrintViewManagerQt::OnSetupScriptedPrintPreview(content::RenderFrameHost* rfh, + IPC::Message* reply_msg) +{ + // ignore the scripted print + rfh->Send(reply_msg); + + content::WebContentsView *view = static_cast<content::WebContentsImpl*>(web_contents())->GetView(); + WebContentsAdapterClient *client = WebContentsViewQt::from(view)->client(); + + if (!client) + return; + + // close preview + rfh->Send(new PrintMsg_ClosePrintPreviewDialog(rfh->GetRoutingID())); + + client->printRequested(); +} + +void PrintViewManagerQt::OnShowScriptedPrintPreview(content::RenderFrameHost* rfh, + bool source_is_modifiable) +{ + // ignore for now +} + +void PrintViewManagerQt::PrintPreviewDone() { + m_printPreviewRfh->Send(new PrintMsg_ClosePrintPreviewDialog( + m_printPreviewRfh->GetRoutingID())); + m_printPreviewRfh = nullptr; +} } // namespace QtWebEngineCore |