blob: 42975048589a9390d4ba264f788ff7b823780070 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/printing/print_test_utils.h"
#include <string>
#include <utility>
#include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/printing/print_view_manager_common.h"
#include "printing/buildflags/buildflags.h"
#include "printing/mojom/print.mojom.h"
#include "printing/print_job_constants.h"
#if BUILDFLAG(ENABLE_OOP_PRINTING_NO_OOP_BASIC_PRINT_DIALOG)
#include "chrome/browser/printing/oop_features.h"
#endif
namespace printing::test {
const char kPrinterName[] = "DefaultPrinter";
const PrinterSemanticCapsAndDefaults::Paper kPaperLetter{
/*display_name=*/"Letter", /*vendor_id=*/"45",
/*size_um=*/gfx::Size(215900, 279400),
/*printable_area_um=*/gfx::Rect(1764, 1764, 212372, 275872)};
const PrinterSemanticCapsAndDefaults::Paper kPaperLegal{
/*display_name=*/"Legal", /*vendor_id=*/"46",
/*size_um=*/gfx::Size(215900, 355600),
/*printable_area_um=*/gfx::Rect(1764, 1764, 212372, 352072)};
const std::vector<gfx::Size> kPrinterCapabilitiesDefaultDpis{
kPrinterCapabilitiesDpi};
const PrinterBasicInfoOptions kPrintInfoOptions{{"opt1", "123"},
{"opt2", "456"}};
base::Value::Dict GetPrintTicket(mojom::PrinterType type) {
base::Value::Dict ticket;
// Letter
base::Value::Dict media_size;
media_size.Set(kSettingMediaSizeIsDefault, true);
media_size.Set(kSettingMediaSizeWidthMicrons, 215900);
media_size.Set(kSettingMediaSizeHeightMicrons, 279400);
ticket.Set(kSettingMediaSize, std::move(media_size));
ticket.Set(kSettingPreviewPageCount, 1);
ticket.Set(kSettingLandscape, false);
ticket.Set(kSettingColor, 2); // color printing
ticket.Set(kSettingHeaderFooterEnabled, false);
ticket.Set(kSettingMarginsType, 0); // default margins
ticket.Set(kSettingDuplexMode,
static_cast<int>(mojom::DuplexMode::kLongEdge));
ticket.Set(kSettingCopies, 1);
ticket.Set(kSettingCollate, true);
ticket.Set(kSettingShouldPrintBackgrounds, false);
ticket.Set(kSettingShouldPrintSelectionOnly, false);
ticket.Set(kSettingPreviewModifiable, true);
ticket.Set(kSettingPrinterType, static_cast<int>(type));
ticket.Set(kSettingRasterizePdf, false);
ticket.Set(kSettingScaleFactor, 100);
ticket.Set(kSettingScalingType, FIT_TO_PAGE);
ticket.Set(kSettingPagesPerSheet, 1);
ticket.Set(kSettingDpiHorizontal, kPrinterDpi);
ticket.Set(kSettingDpiVertical, kPrinterDpi);
ticket.Set(kSettingDeviceName, kPrinterName);
ticket.Set(kSettingPageWidth, 215900);
ticket.Set(kSettingPageHeight, 279400);
ticket.Set(kSettingShowSystemDialog, false);
if (type == mojom::PrinterType::kExtension) {
base::Value::Dict capabilities;
capabilities.Set("duplex", true); // non-empty
std::string caps_string;
base::JSONWriter::Write(capabilities, &caps_string);
ticket.Set(kSettingCapabilities, caps_string);
base::Value::Dict print_ticket;
print_ticket.Set("version", "1.0");
print_ticket.Set("print", base::Value());
std::string ticket_string;
base::JSONWriter::Write(print_ticket, &ticket_string);
ticket.Set(kSettingTicket, ticket_string);
}
return ticket;
}
std::unique_ptr<PrintSettings> MakeDefaultPrintSettings(
const std::string& printer_name) {
// Setup a sample page setup, which is needed to pass checks in
// `PrintRenderFrameHelper` that the print params are valid.
constexpr gfx::Size kPhysicalSize = gfx::Size(200, 200);
constexpr gfx::Rect kPrintableArea = gfx::Rect(0, 0, 200, 200);
const PageMargins kRequestedMargins(0, 0, 5, 5, 5, 5);
const PageSetup kPageSetup(kPhysicalSize, kPrintableArea, kRequestedMargins,
/*forced_margins=*/false,
/*text_height=*/0);
auto settings = std::make_unique<PrintSettings>();
settings->set_copies(kPrintSettingsCopies);
settings->set_dpi(kPrinterDefaultRenderDpi);
settings->set_page_setup_device_units(kPageSetup);
settings->set_device_name(base::ASCIIToUTF16(printer_name));
settings->set_duplex_mode(mojom::DuplexMode::kSimplex);
settings->set_color(mojom::ColorModel::kGray);
return settings;
}
std::unique_ptr<PrintSettings> MakeUserModifiedPrintSettings(
const std::string& printer_name,
const PageRanges* page_ranges) {
std::unique_ptr<PrintSettings> settings =
MakeDefaultPrintSettings(printer_name);
settings->set_copies(kPrintSettingsCopies + 1);
if (page_ranges) {
settings->set_ranges(*page_ranges);
}
#if BUILDFLAG(ENABLE_OOP_PRINTING_NO_OOP_BASIC_PRINT_DIALOG)
if (ShouldPrintJobOop()) {
// Supply fake data to mimic what might be collected from the system print
// dialog. Platform-specific since the fake data still has to be able to
// pass mojom data validation.
base::Value::Dict data;
#if BUILDFLAG(IS_MAC)
data.Set(kMacSystemPrintDialogDataDestinationType, 2);
data.Set(kMacSystemPrintDialogDataPageFormat,
base::Value::BlobStorage({0xF1}));
data.Set(kMacSystemPrintDialogDataPrintSettings,
base::Value::BlobStorage({0xB2}));
#elif BUILDFLAG(IS_LINUX)
data.Set(kLinuxSystemPrintDialogDataPrinter, printer_name);
data.Set(kLinuxSystemPrintDialogDataPrintSettings, "print-settings");
data.Set(kLinuxSystemPrintDialogDataPageSetup, "page-setup");
#else
#error "Missing fake system print dialog data for this platform."
#endif
settings->set_system_print_dialog_data(std::move(data));
}
#endif // BUILDFLAG(ENABLE_OOP_PRINTING_NO_OOP_BASIC_PRINT_DIALOG)
return settings;
}
void StartPrint(content::WebContents* contents) {
printing::StartPrint(contents,
#if BUILDFLAG(IS_CHROMEOS)
/*print_renderer=*/mojo::NullAssociatedRemote(),
#endif
/*print_preview_disabled=*/false,
/*has_selection=*/false);
}
} // namespace printing::test