diff options
Diffstat (limited to 'chromium/chrome/browser/ui/webui/print_preview')
11 files changed, 191 insertions, 156 deletions
diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc index 9b926a8b629..9edda51b6d3 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc @@ -25,7 +25,7 @@ #include "chrome/browser/ui/webui/print_preview/print_preview_utils.h" #include "chrome/common/pref_names.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/debug_daemon_client.h" +#include "chromeos/dbus/debug_daemon/debug_daemon_client.h" #include "chromeos/printing/printer_configuration.h" #include "components/prefs/pref_service.h" #include "components/printing/browser/printer_capabilities.h" @@ -303,6 +303,9 @@ base::Value LocalPrinterHandlerChromeos::GetNativePrinterPolicies() const { policies.SetKey( kAllowedPinModes, base::Value(prefs->GetInteger(prefs::kPrintingAllowedPinModes))); + policies.SetKey(kAllowedBackgroundGraphicsModes, + base::Value(prefs->GetInteger( + prefs::kPrintingAllowedBackgroundGraphicsModes))); policies.SetKey(kDefaultColorMode, base::Value(prefs->GetInteger(prefs::kPrintingColorDefault))); policies.SetKey( @@ -310,6 +313,9 @@ base::Value LocalPrinterHandlerChromeos::GetNativePrinterPolicies() const { base::Value(prefs->GetInteger(prefs::kPrintingDuplexDefault))); policies.SetKey(kDefaultPinMode, base::Value(prefs->GetInteger(prefs::kPrintingPinDefault))); + policies.SetKey(kDefaultBackgroundGraphicsMode, + base::Value(prefs->GetInteger( + prefs::kPrintingBackgroundGraphicsDefault))); return policies; } diff --git a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc index 756f3b374ea..5329108a661 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc @@ -289,20 +289,26 @@ TEST_F(LocalPrinterHandlerChromeosTest, GetNativePrinterPolicies) { std::make_unique<base::Value>(0)); prefs->SetUserPref(prefs::kPrintingAllowedPinModes, std::make_unique<base::Value>(1)); + prefs->SetUserPref(prefs::kPrintingAllowedBackgroundGraphicsModes, + std::make_unique<base::Value>(2)); prefs->SetUserPref(prefs::kPrintingColorDefault, std::make_unique<base::Value>(2)); prefs->SetUserPref(prefs::kPrintingDuplexDefault, std::make_unique<base::Value>(4)); prefs->SetUserPref(prefs::kPrintingPinDefault, std::make_unique<base::Value>(0)); + prefs->SetUserPref(prefs::kPrintingBackgroundGraphicsDefault, + std::make_unique<base::Value>(0)); base::Value expected_policies(base::Value::Type::DICTIONARY); expected_policies.SetKey(kAllowedColorModes, base::Value(1)); expected_policies.SetKey(kAllowedDuplexModes, base::Value(0)); expected_policies.SetKey(kAllowedPinModes, base::Value(1)); + expected_policies.SetKey(kAllowedBackgroundGraphicsModes, base::Value(2)); expected_policies.SetKey(kDefaultColorMode, base::Value(2)); expected_policies.SetKey(kDefaultDuplexMode, base::Value(4)); expected_policies.SetKey(kDefaultPinMode, base::Value(0)); + expected_policies.SetKey(kDefaultBackgroundGraphicsMode, base::Value(0)); EXPECT_EQ(expected_policies, local_printer_handler_->GetNativePrinterPolicies()); diff --git a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc index 00cf10991ed..f0033a7e67b 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc @@ -72,38 +72,41 @@ gfx::Size GetDefaultPdfMediaSizeMicrons() { } base::Value GetPdfCapabilities(const std::string& locale) { - cloud_devices::CloudDeviceDescription description; - using namespace cloud_devices::printer; + using cloud_devices::printer::MediaType; - OrientationCapability orientation; + cloud_devices::CloudDeviceDescription description; + cloud_devices::printer::OrientationCapability orientation; orientation.AddOption(cloud_devices::printer::OrientationType::PORTRAIT); orientation.AddOption(cloud_devices::printer::OrientationType::LANDSCAPE); - orientation.AddDefaultOption(OrientationType::AUTO_ORIENTATION, true); + orientation.AddDefaultOption( + cloud_devices::printer::OrientationType::AUTO_ORIENTATION, true); orientation.SaveTo(&description); - ColorCapability color; + cloud_devices::printer::ColorCapability color; { - Color standard_color(ColorType::STANDARD_COLOR); + cloud_devices::printer::Color standard_color( + cloud_devices::printer::ColorType::STANDARD_COLOR); standard_color.vendor_id = base::NumberToString(COLOR); color.AddDefaultOption(standard_color, true); } color.SaveTo(&description); - static const cloud_devices::printer::MediaType kPdfMedia[] = { + static const MediaType kPdfMedia[] = { MediaType::ISO_A0, MediaType::ISO_A1, MediaType::ISO_A2, MediaType::ISO_A3, MediaType::ISO_A4, MediaType::ISO_A5, MediaType::NA_LEGAL, MediaType::NA_LETTER, MediaType::NA_LEDGER}; const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons(); - Media default_media("", "", default_media_size.width(), - default_media_size.height()); + cloud_devices::printer::Media default_media(std::string(), std::string(), + default_media_size.width(), + default_media_size.height()); if (!default_media.MatchBySize() || !base::Contains(kPdfMedia, default_media.type)) { - default_media = - Media(locale == "en-US" ? MediaType::NA_LETTER : MediaType::ISO_A4); + default_media = cloud_devices::printer::Media( + locale == "en-US" ? MediaType::NA_LETTER : MediaType::ISO_A4); } - MediaCapability media; + cloud_devices::printer::MediaCapability media; for (const auto& pdf_media : kPdfMedia) { - Media media_option(pdf_media); + cloud_devices::printer::Media media_option(pdf_media); media.AddDefaultOption(media_option, default_media.type == media_option.type); } diff --git a/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc b/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc index dbaa090f34c..11ab72453e8 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/policy_settings.cc @@ -14,10 +14,13 @@ void PolicySettings::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref(prefs::kPrintHeaderFooter, true); #if defined(OS_CHROMEOS) + registry->RegisterIntegerPref(prefs::kPrintingAllowedBackgroundGraphicsModes, + 0); registry->RegisterIntegerPref(prefs::kPrintingAllowedColorModes, 0); registry->RegisterIntegerPref(prefs::kPrintingAllowedDuplexModes, 0); registry->RegisterIntegerPref(prefs::kPrintingAllowedPinModes, 0); registry->RegisterListPref(prefs::kPrintingAllowedPageSizes); + registry->RegisterIntegerPref(prefs::kPrintingBackgroundGraphicsDefault, 0); registry->RegisterIntegerPref(prefs::kPrintingColorDefault, 0); registry->RegisterIntegerPref(prefs::kPrintingDuplexDefault, 0); registry->RegisterIntegerPref(prefs::kPrintingPinDefault, 0); diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 977fa0091ff..2ecb8cdde5a 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.cc @@ -147,6 +147,7 @@ enum PrintSettingsBuckets { DEFAULT_DPI, NON_DEFAULT_DPI, PIN, + FIT_TO_PAPER, PRINT_SETTINGS_BUCKET_BOUNDARY }; @@ -315,9 +316,6 @@ void ReportPrintSettingsStats(const base::Value& print_settings, if (print_settings.FindIntKey(kSettingCopies).value_or(1) > 1) ReportPrintSettingHistogram(COPIES); - if (preview_settings.FindIntKey(kSettingScaleFactor).value_or(100) != 100) - ReportPrintSettingHistogram(SCALING); - if (preview_settings.FindIntKey(kSettingPagesPerSheet).value_or(1) != 1) ReportPrintSettingHistogram(PAGES_PER_SHEET); @@ -354,9 +352,18 @@ void ReportPrintSettingsStats(const base::Value& print_settings, if (preview_settings.FindBoolKey(kSettingRasterizePdf).value_or(false)) ReportPrintSettingHistogram(PRINT_AS_IMAGE); - if (is_pdf && - preview_settings.FindBoolKey(kSettingFitToPageEnabled).value_or(false)) { - ReportPrintSettingHistogram(FIT_TO_PAGE); + ScalingType scaling_type = + static_cast<ScalingType>(preview_settings.FindIntKey(kSettingScalingType) + .value_or(ScalingType::DEFAULT)); + if (scaling_type == ScalingType::CUSTOM) { + ReportPrintSettingHistogram(SCALING); + } + + if (is_pdf) { + if (scaling_type == ScalingType::FIT_TO_PAGE) + ReportPrintSettingHistogram(FIT_TO_PAGE); + else if (scaling_type == ScalingType::FIT_TO_PAPER) + ReportPrintSettingHistogram(FIT_TO_PAPER); } if (print_settings.FindIntKey(kSettingDpiHorizontal).value_or(0) > 0 && @@ -377,21 +384,32 @@ void ReportPrintSettingsStats(const base::Value& print_settings, UserActionBuckets DetermineUserAction(const base::Value& settings) { #if defined(OS_MACOSX) - if (settings.FindKey(kSettingOpenPDFInPreview) != nullptr) + if (settings.FindKey(kSettingOpenPDFInPreview)) return OPEN_IN_MAC_PREVIEW; #endif // This needs to be checked before checking for a cloud print ID, since a // print ticket for printing to Drive will also contain a cloud print ID. if (settings.FindBoolKey(kSettingPrintToGoogleDrive).value_or(false)) return PRINT_TO_GOOGLE_DRIVE; - if (settings.FindKey(kSettingCloudPrintId) != nullptr) + if (settings.FindKey(kSettingCloudPrintId)) return PRINT_WITH_CLOUD_PRINT; - if (settings.FindBoolKey(kSettingPrintWithPrivet).value_or(false)) - return PRINT_WITH_PRIVET; - if (settings.FindBoolKey(kSettingPrintWithExtension).value_or(false)) - return PRINT_WITH_EXTENSION; - if (settings.FindBoolKey(kSettingPrintToPDF).value_or(false)) - return PRINT_TO_PDF; + + PrinterType type = static_cast<PrinterType>( + settings.FindIntKey(kSettingPrinterType).value()); + switch (type) { + case kPrivetPrinter: + return PRINT_WITH_PRIVET; + case kExtensionPrinter: + return PRINT_WITH_EXTENSION; + case kPdfPrinter: + return PRINT_TO_PDF; + case kLocalPrinter: + break; + default: + NOTREACHED(); + break; + } + if (settings.FindBoolKey(kSettingShowSystemDialog).value_or(false)) return FALLBACK_TO_ADVANCED_SETTINGS_DIALOG; return PRINT_TO_PRINTER; @@ -965,7 +983,7 @@ void PrintPreviewHandler::GetUserAccountList(base::Value* settings) { const std::vector<gaia::ListedAccount>& accounts = identity_manager_->GetAccountsInCookieJar().signed_in_accounts; for (const gaia::ListedAccount& account : accounts) { - account_list.GetList().emplace_back(account.email); + account_list.Append(account.email); } settings->SetKey(kSyncAvailable, base::Value(true)); } else { @@ -982,6 +1000,8 @@ void PrintPreviewHandler::SendInitialSettings( print_preview_ui()->initiator_title()); initial_settings.SetBoolKey(kSettingPreviewModifiable, print_preview_ui()->source_is_modifiable()); + initial_settings.SetBoolKey(kSettingPreviewIsPdf, + print_preview_ui()->source_is_pdf()); initial_settings.SetStringKey(kSettingPrinterName, default_printer); initial_settings.SetBoolKey(kDocumentHasSelection, print_preview_ui()->source_has_selection()); @@ -1122,7 +1142,7 @@ void PrintPreviewHandler::OnAccountsInCookieUpdated( const std::vector<gaia::ListedAccount>& accounts = accounts_in_cookie_jar_info.signed_in_accounts; for (const auto account : accounts) { - account_list.GetList().emplace_back(account.email); + account_list.Append(account.email); } FireWebUIListener("user-accounts-updated", std::move(account_list)); } @@ -1136,6 +1156,10 @@ void PrintPreviewHandler::OnPrintPreviewReady(int preview_uid, int request_id) { } void PrintPreviewHandler::OnPrintPreviewFailed(int request_id) { + WebContents* initiator = GetInitiator(); + if (!initiator || initiator->IsBeingDestroyed()) + return; // Drop notification if fired during destruction sequence. + std::string callback_id = GetCallbackId(request_id); if (callback_id.empty()) return; diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h index bdccac1a8a4..e5f5f921753 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler.h @@ -38,16 +38,6 @@ class PdfPrinterHandler; class PrinterHandler; class PrintPreviewUI; -// Must match print_preview.PrinterType in -// chrome/browser/resources/print_preview/native_layer.js -enum PrinterType { - kPrivetPrinter, - kExtensionPrinter, - kPdfPrinter, - kLocalPrinter, - kCloudPrinter -}; - // The handler for Javascript messages related to the print preview dialog. class PrintPreviewHandler : public content::WebUIMessageHandler, public signin::IdentityManager::Observer { diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc index e56a96a4703..6d724094aa6 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc @@ -48,9 +48,13 @@ namespace { const char kDummyInitiatorName[] = "TestInitiator"; const char kTestData[] = "abc"; -// Array of all PrinterType values. -const PrinterType kAllTypes[] = {kPrivetPrinter, kExtensionPrinter, kPdfPrinter, - kLocalPrinter}; +// Array of all PrinterTypes. +constexpr PrinterType kAllTypes[] = {kPrivetPrinter, kExtensionPrinter, + kPdfPrinter, kLocalPrinter, kCloudPrinter}; + +// Array of all PrinterTypes that have working PrinterHandlers. +constexpr PrinterType kAllSupportedTypes[] = {kPrivetPrinter, kExtensionPrinter, + kPdfPrinter, kLocalPrinter}; struct PrinterInfo { std::string id; @@ -90,14 +94,15 @@ PrinterInfo GetEmptyPrinterInfo() { return empty_printer; } -base::Value GetPrintPreviewTicket(bool is_pdf) { - base::Value print_ticket = GetPrintTicket(kLocalPrinter, false); +base::Value GetPrintPreviewTicket() { + base::Value print_ticket = GetPrintTicket(kLocalPrinter); // Make some modifications to match a preview print ticket. print_ticket.SetKey(kSettingPageRange, base::Value()); - print_ticket.SetKey(kIsFirstRequest, base::Value(true)); - print_ticket.SetKey(kPreviewRequestID, base::Value(0)); - print_ticket.SetKey(kSettingPreviewModifiable, base::Value(is_pdf)); + print_ticket.SetBoolKey(kIsFirstRequest, true); + print_ticket.SetIntKey(kPreviewRequestID, 0); + print_ticket.SetBoolKey(kSettingPreviewModifiable, false); + print_ticket.SetBoolKey(kSettingPreviewIsPdf, true); print_ticket.RemoveKey(kSettingPageWidth); print_ticket.RemoveKey(kSettingPageHeight); print_ticket.RemoveKey(kSettingShowSystemDialog); @@ -109,10 +114,10 @@ std::unique_ptr<base::ListValue> ConstructPreviewArgs( base::StringPiece callback_id, const base::Value& print_ticket) { base::Value args(base::Value::Type::LIST); - args.GetList().emplace_back(callback_id); + args.Append(callback_id); std::string json; base::JSONWriter::Write(print_ticket, &json); - args.GetList().emplace_back(json); + args.Append(json); return base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); } @@ -292,7 +297,7 @@ class PrintPreviewHandlerTest : public testing::Test { // Sending this message will enable javascript, so it must always be called // before any other messages are sent. base::Value args(base::Value::Type::LIST); - args.GetList().emplace_back("test-callback-id-0"); + args.Append("test-callback-id-0"); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); @@ -512,8 +517,8 @@ TEST_F(PrintPreviewHandlerTest, GetPrinters) { base::Value args(base::Value::Type::LIST); std::string callback_id_in = "test-callback-id-" + base::NumberToString(i + 1); - args.GetList().emplace_back(callback_id_in); - args.GetList().emplace_back(type); + args.Append(callback_id_in); + args.Append(type); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); handler()->HandleGetPrinters(list_args.get()); @@ -531,7 +536,7 @@ TEST_F(PrintPreviewHandlerTest, GetPrinters) { ASSERT_TRUE(add_data.arg2()->GetAsInteger(&type_out)); EXPECT_EQ(type, type_out); ASSERT_TRUE(add_data.arg3()); - const base::Value::ListStorage& printer_list = add_data.arg3()->GetList(); + base::span<const base::Value> printer_list = add_data.arg3()->GetList(); ASSERT_EQ(printer_list.size(), 1u); EXPECT_TRUE(printer_list[0].FindKeyOfType("printer_name", base::Value::Type::STRING)); @@ -552,15 +557,15 @@ TEST_F(PrintPreviewHandlerTest, GetPrinterCapabilities) { // Check all four printer types that implement // PrinterHandler::StartGetCapability(). - for (size_t i = 0; i < base::size(kAllTypes); i++) { - PrinterType type = kAllTypes[i]; + for (size_t i = 0; i < base::size(kAllSupportedTypes); i++) { + PrinterType type = kAllSupportedTypes[i]; handler()->reset_calls(); base::Value args(base::Value::Type::LIST); std::string callback_id_in = "test-callback-id-" + base::NumberToString(i + 1); - args.GetList().emplace_back(callback_id_in); - args.GetList().emplace_back(kDummyPrinterName); - args.GetList().emplace_back(type); + args.Append(callback_id_in); + args.Append(kDummyPrinterName); + args.Append(type); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); handler()->HandleGetPrinterCapabilities(list_args.get()); @@ -581,24 +586,25 @@ TEST_F(PrintPreviewHandlerTest, GetPrinterCapabilities) { // Run through the loop again, this time with a printer that has no // capabilities. - for (size_t i = 0; i < base::size(kAllTypes); i++) { - PrinterType type = kAllTypes[i]; + for (size_t i = 0; i < base::size(kAllSupportedTypes); i++) { + PrinterType type = kAllSupportedTypes[i]; handler()->reset_calls(); base::Value args(base::Value::Type::LIST); std::string callback_id_in = "test-callback-id-" + - base::NumberToString(i + base::size(kAllTypes) + 1); - args.GetList().emplace_back(callback_id_in); - args.GetList().emplace_back("EmptyPrinter"); - args.GetList().emplace_back(type); + base::NumberToString(i + base::size(kAllSupportedTypes) + 1); + args.Append(callback_id_in); + args.Append("EmptyPrinter"); + args.Append(type); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); handler()->HandleGetPrinterCapabilities(list_args.get()); EXPECT_TRUE(handler()->CalledOnlyForType(type)); - // Start with 1 call from initial settings plus base::size(kAllTypes) from - // first loop, then add 1 more for each loop iteration. - ASSERT_EQ(1u + base::size(kAllTypes) + (i + 1), + // Start with 1 call from initial settings plus + // base::size(kAllSupportedTypes) from first loop, then add 1 more for each + // loop iteration. + ASSERT_EQ(1u + base::size(kAllSupportedTypes) + (i + 1), web_ui()->call_data().size()); // Verify printer capabilities promise was rejected. @@ -610,27 +616,25 @@ TEST_F(PrintPreviewHandlerTest, GetPrinterCapabilities) { TEST_F(PrintPreviewHandlerTest, Print) { Initialize(); - // All four printer types can print, as well as cloud printers. - for (size_t i = 0; i <= base::size(kAllTypes); i++) { - // Also check cloud print. Use dummy type value of Privet (will be ignored). - bool cloud = i == base::size(kAllTypes); - PrinterType type = cloud ? kPrivetPrinter : kAllTypes[i]; + // All printer types can print. + for (size_t i = 0; i < base::size(kAllTypes); i++) { + PrinterType type = kAllTypes[i]; handler()->reset_calls(); base::Value args(base::Value::Type::LIST); std::string callback_id_in = "test-callback-id-" + base::NumberToString(i + 1); - args.GetList().emplace_back(callback_id_in); - base::Value print_ticket = GetPrintTicket(type, cloud); + args.Append(callback_id_in); + base::Value print_ticket = GetPrintTicket(type); std::string json; base::JSONWriter::Write(print_ticket, &json); - args.GetList().emplace_back(json); + args.Append(json); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); handler()->HandlePrint(list_args.get()); // Verify correct PrinterHandler was called or that no handler was requested // for cloud printers. - if (cloud) { + if (type == kCloudPrinter) { EXPECT_TRUE(handler()->NotCalled()); } else { EXPECT_TRUE(handler()->CalledOnlyForType(type)); @@ -641,7 +645,7 @@ TEST_F(PrintPreviewHandlerTest, Print) { CheckWebUIResponse(data, callback_id_in, true); // For cloud print, should also get the encoded data back as a string. - if (cloud) { + if (type == kCloudPrinter) { std::string print_data; ASSERT_TRUE(data.arg3()->GetAsString(&print_data)); std::string expected_data; @@ -654,7 +658,7 @@ TEST_F(PrintPreviewHandlerTest, Print) { TEST_F(PrintPreviewHandlerTest, GetPreview) { Initialize(); - base::Value print_ticket = GetPrintPreviewTicket(false); + base::Value print_ticket = GetPrintPreviewTicket(); std::unique_ptr<base::ListValue> list_args = ConstructPreviewArgs("test-callback-id-1", print_ticket); handler()->HandleGetPreview(list_args.get()); @@ -668,7 +672,7 @@ TEST_F(PrintPreviewHandlerTest, GetPreview) { preview_id_found = true; continue; } - base::Value* value_in = print_ticket.FindKey(it.first); + const base::Value* value_in = print_ticket.FindKey(it.first); ASSERT_TRUE(value_in); EXPECT_EQ(*value_in, it.second); } @@ -679,37 +683,38 @@ TEST_F(PrintPreviewHandlerTest, SendPreviewUpdates) { Initialize(); const char callback_id_in[] = "test-callback-id-1"; - base::Value print_ticket = GetPrintPreviewTicket(false); + base::Value print_ticket = GetPrintPreviewTicket(); std::unique_ptr<base::ListValue> list_args = ConstructPreviewArgs(callback_id_in, print_ticket); handler()->HandleGetPreview(list_args.get()); base::DictionaryValue preview_params = VerifyPreviewMessage(); // Read the preview UI ID and request ID - const base::Value* request_value = preview_params.FindKey(kPreviewRequestID); - ASSERT_TRUE(request_value); - ASSERT_TRUE(request_value->is_int()); - int preview_request_id = request_value->GetInt(); + base::Optional<int> request_value = + preview_params.FindIntKey(kPreviewRequestID); + ASSERT_TRUE(request_value.has_value()); + int preview_request_id = request_value.value(); - const base::Value* ui_value = preview_params.FindKey(kPreviewUIID); - ASSERT_TRUE(ui_value); - ASSERT_TRUE(ui_value->is_int()); - int preview_ui_id = ui_value->GetInt(); + base::Optional<int> ui_value = preview_params.FindIntKey(kPreviewUIID); + ASSERT_TRUE(ui_value.has_value()); + int preview_ui_id = ui_value.value(); // Simulate renderer responses: PageLayoutReady, PageCountReady, // PagePreviewReady, and OnPrintPreviewReady will be called in that order. - base::DictionaryValue layout; - layout.SetKey(kSettingMarginTop, base::Value(34.0)); - layout.SetKey(kSettingMarginLeft, base::Value(34.0)); - layout.SetKey(kSettingMarginBottom, base::Value(34.0)); - layout.SetKey(kSettingMarginRight, base::Value(34.0)); - layout.SetKey(kSettingContentWidth, base::Value(544.0)); - layout.SetKey(kSettingContentHeight, base::Value(700.0)); - layout.SetKey(kSettingPrintableAreaX, base::Value(17)); - layout.SetKey(kSettingPrintableAreaY, base::Value(17)); - layout.SetKey(kSettingPrintableAreaWidth, base::Value(578)); - layout.SetKey(kSettingPrintableAreaHeight, base::Value(734)); - handler()->SendPageLayoutReady(layout, false, preview_request_id); + base::Value layout(base::Value::Type::DICTIONARY); + layout.SetDoubleKey(kSettingMarginTop, 34.0); + layout.SetDoubleKey(kSettingMarginLeft, 34.0); + layout.SetDoubleKey(kSettingMarginBottom, 34.0); + layout.SetDoubleKey(kSettingMarginRight, 34.0); + layout.SetDoubleKey(kSettingContentWidth, 544.0); + layout.SetDoubleKey(kSettingContentHeight, 700.0); + layout.SetIntKey(kSettingPrintableAreaX, 17); + layout.SetIntKey(kSettingPrintableAreaY, 17); + layout.SetIntKey(kSettingPrintableAreaWidth, 578); + layout.SetIntKey(kSettingPrintableAreaHeight, 734); + handler()->SendPageLayoutReady(base::Value::AsDictionaryValue(layout), + /*has_custom_page_size_style,=*/false, + preview_request_id); // Verify that page-layout-ready webUI event was fired. AssertWebUIEventFired(*web_ui()->call_data().back(), "page-layout-ready"); @@ -732,7 +737,8 @@ TEST_F(PrintPreviewHandlerTest, SendPreviewUpdates) { // None of these should work since there has been no new preview request. // Check that there are no new web UI messages sent. size_t message_count = web_ui()->call_data().size(); - handler()->SendPageLayoutReady(base::DictionaryValue(), false, + handler()->SendPageLayoutReady(base::DictionaryValue(), + /*has_custom_page_size_style,=*/false, preview_request_id); EXPECT_EQ(message_count, web_ui()->call_data().size()); handler()->SendPageCountReady(1, -1, 0); @@ -788,15 +794,15 @@ TEST_F(PrintPreviewHandlerFailingTest, GetPrinterCapabilities) { // Check all four printer types that implement // PrinterHandler::StartGetCapability(). - for (size_t i = 0; i < base::size(kAllTypes); i++) { - PrinterType type = kAllTypes[i]; + for (size_t i = 0; i < base::size(kAllSupportedTypes); i++) { + PrinterType type = kAllSupportedTypes[i]; handler()->reset_calls(); base::Value args(base::Value::Type::LIST); std::string callback_id_in = "test-callback-id-" + base::NumberToString(i + 1); - args.GetList().emplace_back(callback_id_in); - args.GetList().emplace_back(kDummyPrinterName); - args.GetList().emplace_back(type); + args.Append(callback_id_in); + args.Append(kDummyPrinterName); + args.Append(type); std::unique_ptr<base::ListValue> list_args = base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); handler()->HandleGetPrinterCapabilities(list_args.get()); diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index a855e2f1d97..820820687a5 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.cc @@ -26,6 +26,7 @@ #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/printing/background_printing_manager.h" #include "chrome/browser/printing/print_preview_data_service.h" #include "chrome/browser/profiles/profile.h" @@ -66,6 +67,10 @@ #include "base/enterprise_util.h" #endif +#if !BUILDFLAG(OPTIMIZE_WEBUI) +#include "chrome/browser/ui/webui/managed_ui_handler.h" +#endif + using content::WebContents; namespace printing { @@ -223,6 +228,7 @@ void AddPrintPreviewStrings(content::WebUIDataSource* source) { {"optionCustomScaling", IDS_PRINT_PREVIEW_OPTION_CUSTOM_SCALING}, {"optionDefaultScaling", IDS_PRINT_PREVIEW_OPTION_DEFAULT_SCALING}, {"optionFitToPage", IDS_PRINT_PREVIEW_OPTION_FIT_TO_PAGE}, + {"optionFitToPaper", IDS_PRINT_PREVIEW_OPTION_FIT_TO_PAPER}, {"optionHeaderFooter", IDS_PRINT_PREVIEW_OPTION_HEADER_FOOTER}, {"optionLandscape", IDS_PRINT_PREVIEW_OPTION_LANDSCAPE}, {"optionLongEdge", IDS_PRINT_PREVIEW_OPTION_LONG_EDGE}, @@ -343,60 +349,44 @@ void SetupPrintPreviewPlugin(content::WebUIDataSource* source) { int id; } kPdfResources[] = { {"pdf/browser_api.js", IDR_PDF_BROWSER_API_JS}, + {"pdf/controller.js", IDR_PDF_CONTROLLER_JS}, {"pdf/elements/icons.html", IDR_PDF_ICONS_HTML}, {"pdf/elements/shared-vars.html", IDR_PDF_SHARED_VARS_HTML}, - {"pdf/elements/viewer-bookmark/viewer-bookmark.html", - IDR_PDF_VIEWER_BOOKMARK_HTML}, - {"pdf/elements/viewer-bookmark/viewer-bookmark.js", - IDR_PDF_VIEWER_BOOKMARK_JS}, - {"pdf/elements/viewer-error-screen/viewer-error-screen.html", - IDR_PDF_VIEWER_ERROR_SCREEN_HTML}, - {"pdf/elements/viewer-error-screen/viewer-error-screen.js", - IDR_PDF_VIEWER_ERROR_SCREEN_JS}, + {"pdf/elements/viewer-bookmark.html", IDR_PDF_VIEWER_BOOKMARK_HTML}, + {"pdf/elements/viewer-bookmark.js", IDR_PDF_VIEWER_BOOKMARK_JS}, + {"pdf/elements/viewer-error-screen.html", IDR_PDF_VIEWER_ERROR_SCREEN_HTML}, + {"pdf/elements/viewer-error-screen.js", IDR_PDF_VIEWER_ERROR_SCREEN_JS}, #if defined(OS_CHROMEOS) - {"pdf/elements/viewer-ink-host/viewer-ink-host.html", - IDR_PDF_VIEWER_INK_HOST_HTML}, - {"pdf/elements/viewer-ink-host/viewer-ink-host.js", - IDR_PDF_VIEWER_INK_HOST_JS}, + {"pdf/elements/viewer-ink-host.html", IDR_PDF_VIEWER_INK_HOST_HTML}, + {"pdf/elements/viewer-ink-host.js", IDR_PDF_VIEWER_INK_HOST_JS}, #endif - {"pdf/elements/viewer-page-indicator/viewer-page-indicator.html", + {"pdf/elements/viewer-page-indicator.html", IDR_PDF_VIEWER_PAGE_INDICATOR_HTML}, - {"pdf/elements/viewer-page-indicator/viewer-page-indicator.js", - IDR_PDF_VIEWER_PAGE_INDICATOR_JS}, - {"pdf/elements/viewer-page-selector/viewer-page-selector.html", + {"pdf/elements/viewer-page-indicator.js", IDR_PDF_VIEWER_PAGE_INDICATOR_JS}, + {"pdf/elements/viewer-page-selector.html", IDR_PDF_VIEWER_PAGE_SELECTOR_HTML}, - {"pdf/elements/viewer-page-selector/viewer-page-selector.js", - IDR_PDF_VIEWER_PAGE_SELECTOR_JS}, - {"pdf/elements/viewer-password-screen/viewer-password-screen.html", + {"pdf/elements/viewer-page-selector.js", IDR_PDF_VIEWER_PAGE_SELECTOR_JS}, + {"pdf/elements/viewer-password-screen.html", IDR_PDF_VIEWER_PASSWORD_SCREEN_HTML}, - {"pdf/elements/viewer-password-screen/viewer-password-screen.js", + {"pdf/elements/viewer-password-screen.js", IDR_PDF_VIEWER_PASSWORD_SCREEN_JS}, - {"pdf/elements/viewer-pdf-toolbar/viewer-pdf-toolbar.html", - IDR_PDF_VIEWER_PDF_TOOLBAR_HTML}, - {"pdf/elements/viewer-pdf-toolbar/viewer-pdf-toolbar.js", - IDR_PDF_VIEWER_PDF_TOOLBAR_JS}, + {"pdf/elements/viewer-pdf-toolbar.html", IDR_PDF_VIEWER_PDF_TOOLBAR_HTML}, + {"pdf/elements/viewer-pdf-toolbar.js", IDR_PDF_VIEWER_PDF_TOOLBAR_JS}, #if defined(OS_CHROMEOS) - {"pdf/elements/viewer-form-warning/viewer-form-warning.html", - IDR_PDF_VIEWER_FORM_WARNING_HTML}, - {"pdf/elements/viewer-form-warning/viewer-form-warning.js", - IDR_PDF_VIEWER_FORM_WARNING_JS}, - {"pdf/elements/viewer-pen-options/viewer-pen-options.html", - IDR_PDF_VIEWER_PEN_OPTIONS_HTML}, - {"pdf/elements/viewer-pen-options/viewer-pen-options.js", - IDR_PDF_VIEWER_PEN_OPTIONS_JS}, + {"pdf/elements/viewer-form-warning.html", IDR_PDF_VIEWER_FORM_WARNING_HTML}, + {"pdf/elements/viewer-form-warning.js", IDR_PDF_VIEWER_FORM_WARNING_JS}, + {"pdf/elements/viewer-pen-options.html", IDR_PDF_VIEWER_PEN_OPTIONS_HTML}, + {"pdf/elements/viewer-pen-options.js", IDR_PDF_VIEWER_PEN_OPTIONS_JS}, #endif - {"pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.html", + {"pdf/elements/viewer-toolbar-dropdown.html", IDR_PDF_VIEWER_TOOLBAR_DROPDOWN_HTML}, - {"pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.js", + {"pdf/elements/viewer-toolbar-dropdown.js", IDR_PDF_VIEWER_TOOLBAR_DROPDOWN_JS}, - {"pdf/elements/viewer-zoom-toolbar/viewer-zoom-button.html", - IDR_PDF_VIEWER_ZOOM_BUTTON_HTML}, - {"pdf/elements/viewer-zoom-toolbar/viewer-zoom-button.js", - IDR_PDF_VIEWER_ZOOM_BUTTON_JS}, - {"pdf/elements/viewer-zoom-toolbar/viewer-zoom-toolbar.html", + {"pdf/elements/viewer-zoom-button.html", IDR_PDF_VIEWER_ZOOM_BUTTON_HTML}, + {"pdf/elements/viewer-zoom-button.js", IDR_PDF_VIEWER_ZOOM_BUTTON_JS}, + {"pdf/elements/viewer-zoom-toolbar.html", IDR_PDF_VIEWER_ZOOM_SELECTOR_HTML}, - {"pdf/elements/viewer-zoom-toolbar/viewer-zoom-toolbar.js", - IDR_PDF_VIEWER_ZOOM_SELECTOR_JS}, + {"pdf/elements/viewer-zoom-toolbar.js", IDR_PDF_VIEWER_ZOOM_SELECTOR_JS}, {"pdf/gesture_detector.js", IDR_PDF_GESTURE_DETECTOR_JS}, {"pdf/index.css", IDR_PDF_INDEX_CSS}, {"pdf/index.html", IDR_PDF_INDEX_HTML}, @@ -470,7 +460,12 @@ PrintPreviewUI::PrintPreviewUI(content::WebUI* web_ui) handler_(CreatePrintPreviewHandlers(web_ui)) { // Set up the chrome://print/ data source. Profile* profile = Profile::FromWebUI(web_ui); - content::WebUIDataSource::Add(profile, CreatePrintPreviewUISource(profile)); + content::WebUIDataSource* source = CreatePrintPreviewUISource(profile); +#if !BUILDFLAG(OPTIMIZE_WEBUI) + // For the Polymer 3 demo page. + ManagedUIHandler::Initialize(web_ui, source); +#endif + content::WebUIDataSource::Add(profile, source); // Set up the chrome://theme/ source. content::URLDataSource::Add(profile, std::make_unique<ThemeSource>(profile)); @@ -574,6 +569,7 @@ void PrintPreviewUI::SetInitialParams( PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( print_preview_dialog->GetWebUI()->GetController()); print_preview_ui->source_is_modifiable_ = params.is_modifiable; + print_preview_ui->source_is_pdf_ = params.is_pdf; print_preview_ui->source_has_selection_ = params.has_selection; print_preview_ui->print_selection_only_ = params.selection_only; } diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h index 2aca55e7bc1..1922e87b53e 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_ui.h @@ -61,6 +61,8 @@ class PrintPreviewUI : public ConstrainedWebDialogUI { bool source_is_modifiable() const { return source_is_modifiable_; } + bool source_is_pdf() const { return source_is_pdf_; } + bool source_has_selection() const { return source_has_selection_; } bool print_selection_only() const { return print_selection_only_; } @@ -257,6 +259,9 @@ class PrintPreviewUI : public ConstrainedWebDialogUI { // Indicates whether the source document can be modified. bool source_is_modifiable_ = true; + // Indicates whether the source document is a PDF. + bool source_is_pdf_ = false; + // Indicates whether the source document has selection. bool source_has_selection_ = false; diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils.cc index e9d21dc1c15..e8af4416366 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils.cc @@ -212,15 +212,12 @@ bool ParseSettings(const base::Value& settings, std::string* out_capabilities, gfx::Size* out_page_size, base::Value* out_ticket) { - const std::string* destination_id_opt = - settings.FindStringKey(kSettingDeviceName); const std::string* ticket_opt = settings.FindStringKey(kSettingTicket); const std::string* capabilities_opt = settings.FindStringKey(kSettingCapabilities); out_page_size->SetSize(settings.FindIntKey(kSettingPageWidth).value_or(0), settings.FindIntKey(kSettingPageHeight).value_or(0)); - if (!destination_id_opt || !ticket_opt || !capabilities_opt || - out_page_size->IsEmpty()) { + if (!ticket_opt || !capabilities_opt || out_page_size->IsEmpty()) { NOTREACHED(); return false; } @@ -229,7 +226,7 @@ bool ParseSettings(const base::Value& settings, if (!ticket_value) return false; - *out_destination_id = *destination_id_opt; + *out_destination_id = *settings.FindStringKey(kSettingDeviceName); *out_capabilities = *capabilities_opt; *out_ticket = std::move(*ticket_value); return true; diff --git a/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc b/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc index 2fed881bf5d..1d84fb3e65c 100644 --- a/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc +++ b/chromium/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc @@ -163,8 +163,7 @@ void ValidateVendorCaps(const base::Value* printer_out, ASSERT_TRUE(vendor_capability_out); size_t index = 0; - const base::Value::ListStorage& output_list = - vendor_capability_out->GetList(); + base::span<const base::Value> output_list = vendor_capability_out->GetList(); for (const auto& input_entry : input_vendor_caps->GetList()) { if (!HasValidEntry( input_entry |