summaryrefslogtreecommitdiffstats
path: root/src/core/print_view_manager_qt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/print_view_manager_qt.cpp')
-rw-r--r--src/core/print_view_manager_qt.cpp102
1 files changed, 62 insertions, 40 deletions
diff --git a/src/core/print_view_manager_qt.cpp b/src/core/print_view_manager_qt.cpp
index 4cb0e06eb..8f52cc24a 100644
--- a/src/core/print_view_manager_qt.cpp
+++ b/src/core/print_view_manager_qt.cpp
@@ -43,14 +43,17 @@
#include "type_conversion.h"
#include "web_engine_context.h"
-#include <QtGui/QPageLayout>
-#include <QtGui/QPageSize>
+#include <QtGui/qpagelayout.h>
+#include <QtGui/qpagesize.h>
#include "base/values.h"
+#include "base/memory/ref_counted_memory.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/public/browser/browser_thread.h"
+#include "content/public/common/web_preferences.h"
#include "printing/pdf_metafile_skia.h"
#include "printing/print_job_constants.h"
@@ -61,7 +64,7 @@ static const qreal kMicronsToMillimeter = 1000.0f;
static std::vector<char>
GetStdVectorFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) {
- scoped_ptr<base::SharedMemory> shared_buf(
+ std::unique_ptr<base::SharedMemory> shared_buf(
new base::SharedMemory(handle, true));
if (!shared_buf->Map(data_size)) {
@@ -74,7 +77,7 @@ GetStdVectorFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) {
static scoped_refptr<base::RefCountedBytes>
GetBytesFromHandle(base::SharedMemoryHandle handle, uint32_t data_size) {
- scoped_ptr<base::SharedMemory> shared_buf(
+ std::unique_ptr<base::SharedMemory> shared_buf(
new base::SharedMemory(handle, true));
if (!shared_buf->Map(data_size)) {
@@ -92,7 +95,7 @@ static void SavePdfFile(scoped_refptr<base::RefCountedBytes> data,
DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
DCHECK_GT(data->size(), 0U);
- printing::PdfMetafileSkia metafile;
+ printing::PdfMetafileSkia metafile(printing::PDF_SKIA_DOCUMENT_TYPE);
metafile.InitFromData(static_cast<const void*>(data->front()), data->size());
base::File file(path,
@@ -101,43 +104,58 @@ static void SavePdfFile(scoped_refptr<base::RefCountedBytes> data,
metafile.SaveTo(&file);
}
-static void applyQPageLayoutSettingsToDictionary(const QPageLayout& pageLayout, base::DictionaryValue& print_settings)
+static base::DictionaryValue *createPrintSettings()
{
+ base::DictionaryValue *printSettings = new base::DictionaryValue();
// TO DO: Check if we can use the request ID from Qt here somehow.
static int internalRequestId = 0;
- print_settings.SetBoolean(printing::kIsFirstRequest, internalRequestId++ == 0);
- print_settings.SetInteger(printing::kPreviewRequestID, internalRequestId);
+ printSettings->SetBoolean(printing::kIsFirstRequest, internalRequestId++ == 0);
+ printSettings->SetInteger(printing::kPreviewRequestID, internalRequestId);
+
+ // The following are standard settings that Chromium expects to be set.
+ printSettings->SetBoolean(printing::kSettingPrintToPDF, true);
+ printSettings->SetBoolean(printing::kSettingCloudPrintDialog, false);
+ printSettings->SetBoolean(printing::kSettingPrintWithPrivet, false);
+ printSettings->SetBoolean(printing::kSettingPrintWithExtension, false);
+
+ printSettings->SetBoolean(printing::kSettingGenerateDraftData, false);
+ printSettings->SetBoolean(printing::kSettingPreviewModifiable, false);
+ printSettings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
+ printSettings->SetInteger(printing::kSettingCopies, 1);
+ printSettings->SetBoolean(printing::kSettingCollate, false);
+ printSettings->SetBoolean(printing::kSettingGenerateDraftData, false);
+ printSettings->SetBoolean(printing::kSettingPreviewModifiable, false);
+
+ printSettings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
+ printSettings->SetBoolean(printing::kSettingShouldPrintBackgrounds, true);
+ printSettings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
+ printSettings->SetString(printing::kSettingDeviceName, "");
+ printSettings->SetInteger(printing::kPreviewUIID, 12345678);
+
+ return printSettings;
+}
+
+static void applyQPageLayoutSettingsToDictionary(const QPageLayout &pageLayout, base::DictionaryValue &printSettings)
+{
//Set page size attributes, chromium expects these in micrometers
QSizeF pageSizeInMilimeter = pageLayout.pageSize().size(QPageSize::Millimeter);
- scoped_ptr<base::DictionaryValue> sizeDict(new base::DictionaryValue);
+ std::unique_ptr<base::DictionaryValue> sizeDict(new base::DictionaryValue);
sizeDict->SetInteger(printing::kSettingMediaSizeWidthMicrons, pageSizeInMilimeter.width() * kMicronsToMillimeter);
sizeDict->SetInteger(printing::kSettingMediaSizeHeightMicrons, pageSizeInMilimeter.height() * kMicronsToMillimeter);
- print_settings.Set(printing::kSettingMediaSize, std::move(sizeDict));
-
- print_settings.SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
-
- // The following are standard settings that Chromium expects to be set.
- print_settings.SetBoolean(printing::kSettingPrintToPDF, true);
- print_settings.SetBoolean(printing::kSettingCloudPrintDialog, false);
- print_settings.SetBoolean(printing::kSettingPrintWithPrivet, false);
- print_settings.SetBoolean(printing::kSettingPrintWithExtension, false);
-
- print_settings.SetBoolean(printing::kSettingGenerateDraftData, false);
- print_settings.SetBoolean(printing::kSettingPreviewModifiable, false);
- print_settings.SetInteger(printing::kSettingColor, printing::COLOR);
- print_settings.SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
- print_settings.SetInteger(printing::kSettingDuplexMode, printing::UNKNOWN_DUPLEX_MODE);
- print_settings.SetInteger(printing::kSettingCopies, 1);
- print_settings.SetBoolean(printing::kSettingCollate, false);
- print_settings.SetBoolean(printing::kSettingGenerateDraftData, false);
- print_settings.SetBoolean(printing::kSettingPreviewModifiable, false);
-
- print_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
- print_settings.SetBoolean(printing::kSettingShouldPrintBackgrounds, false);
- print_settings.SetBoolean(printing::kSettingHeaderFooterEnabled, false);
- print_settings.SetString(printing::kSettingDeviceName, "");
- print_settings.SetInteger(printing::kPreviewUIID, 12345678);
+ printSettings.Set(printing::kSettingMediaSize, std::move(sizeDict));
+
+ // Apply page margins
+ QMargins pageMarginsInPoints = pageLayout.marginsPoints();
+ std::unique_ptr<base::DictionaryValue> marginsDict(new base::DictionaryValue);
+ marginsDict->SetInteger(printing::kSettingMarginTop, pageMarginsInPoints.top());
+ marginsDict->SetInteger(printing::kSettingMarginBottom, pageMarginsInPoints.bottom());
+ marginsDict->SetInteger(printing::kSettingMarginLeft, pageMarginsInPoints.left());
+ marginsDict->SetInteger(printing::kSettingMarginRight, pageMarginsInPoints.right());
+ printSettings.Set(printing::kSettingMarginsCustom, std::move(marginsDict));
+ printSettings.SetInteger(printing::kSettingMarginsType, printing::CUSTOM_MARGINS);
+
+ printSettings.SetBoolean(printing::kSettingLandscape, pageLayout.orientation() == QPageLayout::Landscape);
}
} // namespace
@@ -149,20 +167,20 @@ PrintViewManagerQt::~PrintViewManagerQt()
}
#if defined(ENABLE_BASIC_PRINTING)
-bool PrintViewManagerQt::PrintToPDF(const QPageLayout &pageLayout, const QString &filePath)
+bool PrintViewManagerQt::PrintToPDF(const QPageLayout &pageLayout, bool printInColor, const QString &filePath)
{
if (m_printSettings || !filePath.length())
return false;
m_pdfOutputPath = toFilePath(filePath);
- if (!PrintToPDFInternal(pageLayout)) {
+ if (!PrintToPDFInternal(pageLayout, printInColor)) {
resetPdfState();
return false;
}
return true;
}
-bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, const PrintToPDFCallback& callback)
+bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, bool printInColor, const PrintToPDFCallback& callback)
{
if (callback.is_null())
return false;
@@ -176,7 +194,7 @@ bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, c
}
m_pdfPrintCallback = callback;
- if (!PrintToPDFInternal(pageLayout)) {
+ if (!PrintToPDFInternal(pageLayout, printInColor)) {
content::BrowserThread::PostTask(content::BrowserThread::UI,
FROM_HERE,
base::Bind(callback, std::vector<char>()));
@@ -187,12 +205,16 @@ bool PrintViewManagerQt::PrintToPDFWithCallback(const QPageLayout &pageLayout, c
return true;
}
-bool PrintViewManagerQt::PrintToPDFInternal(const QPageLayout &pageLayout)
+bool PrintViewManagerQt::PrintToPDFInternal(const QPageLayout &pageLayout, bool printInColor)
{
if (!pageLayout.isValid())
return false;
- m_printSettings.reset(new base::DictionaryValue());
+ m_printSettings.reset(createPrintSettings());
+
+ m_printSettings->SetInteger(printing::kSettingColor, printInColor ? printing::COLOR : printing::GRAYSCALE);
applyQPageLayoutSettingsToDictionary(pageLayout, *m_printSettings);
+ m_printSettings->SetBoolean(printing::kSettingShouldPrintBackgrounds
+ , web_contents()->GetRenderViewHost()->GetWebkitPreferences().should_print_backgrounds);
return Send(new PrintMsg_InitiatePrintPreview(routing_id(), false));
}