summaryrefslogtreecommitdiffstats
path: root/src/core/printing/print_view_manager_qt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/printing/print_view_manager_qt.cpp')
-rw-r--r--src/core/printing/print_view_manager_qt.cpp165
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