Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/printing/renderer/print_web_view_helper.h" | 5 #include "components/printing/renderer/print_web_view_helper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 28 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
| 29 #include "third_party/WebKit/public/web/WebConsoleMessage.h" | 29 #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
| 30 #include "third_party/WebKit/public/web/WebDocument.h" | 30 #include "third_party/WebKit/public/web/WebDocument.h" |
| 31 #include "third_party/WebKit/public/web/WebElement.h" | 31 #include "third_party/WebKit/public/web/WebElement.h" |
| 32 #include "third_party/WebKit/public/web/WebFrameClient.h" | 32 #include "third_party/WebKit/public/web/WebFrameClient.h" |
| 33 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 33 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 34 #include "third_party/WebKit/public/web/WebPlugin.h" | 34 #include "third_party/WebKit/public/web/WebPlugin.h" |
| 35 #include "third_party/WebKit/public/web/WebPluginDocument.h" | 35 #include "third_party/WebKit/public/web/WebPluginDocument.h" |
| 36 #include "third_party/WebKit/public/web/WebPrintParams.h" | 36 #include "third_party/WebKit/public/web/WebPrintParams.h" |
| 37 #include "third_party/WebKit/public/web/WebPrintPresetOptions.h" | 37 #include "third_party/WebKit/public/web/WebPrintPresetOptions.h" |
| 38 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" | |
| 39 #include "third_party/WebKit/public/web/WebSandboxFlags.h" | 38 #include "third_party/WebKit/public/web/WebSandboxFlags.h" |
| 40 #include "third_party/WebKit/public/web/WebScriptSource.h" | 39 #include "third_party/WebKit/public/web/WebScriptSource.h" |
| 41 #include "third_party/WebKit/public/web/WebSettings.h" | 40 #include "third_party/WebKit/public/web/WebSettings.h" |
| 42 #include "third_party/WebKit/public/web/WebView.h" | 41 #include "third_party/WebKit/public/web/WebView.h" |
| 43 #include "third_party/WebKit/public/web/WebViewClient.h" | 42 #include "third_party/WebKit/public/web/WebViewClient.h" |
| 44 #include "ui/base/resource/resource_bundle.h" | 43 #include "ui/base/resource/resource_bundle.h" |
| 45 | 44 |
| 46 using content::WebPreferences; | 45 using content::WebPreferences; |
| 47 | 46 |
| 48 namespace printing { | 47 namespace printing { |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 305 bool frame_has_custom_page_size_style = false; | 304 bool frame_has_custom_page_size_style = false; |
| 306 for (int i = 0; i < total_page_count; ++i) { | 305 for (int i = 0; i < total_page_count; ++i) { |
| 307 if (frame->hasCustomPageSizeStyle(i)) { | 306 if (frame->hasCustomPageSizeStyle(i)) { |
| 308 frame_has_custom_page_size_style = true; | 307 frame_has_custom_page_size_style = true; |
| 309 break; | 308 break; |
| 310 } | 309 } |
| 311 } | 310 } |
| 312 return frame_has_custom_page_size_style; | 311 return frame_has_custom_page_size_style; |
| 313 } | 312 } |
| 314 | 313 |
| 315 MarginType GetMarginsForPdf(blink::WebFrame* frame, | 314 // Disable scaling when: |
|
Tom Sepez
2015/03/11 19:11:09
nit: when either: (or when both:) depending on and
Lei Zhang
2015/03/11 20:04:42
Done.
| |
| 316 const blink::WebNode& node) { | 315 // - The PDF specifies disabling scaling. |
| 317 if (frame->isPrintScalingDisabledForPlugin(node)) | 316 // - If all the pages in the PDF are the same size, and that size is the same |
|
Tom Sepez
2015/03/11 19:11:08
nit: (super nit). When: ... If feels funny and is
Lei Zhang
2015/03/11 20:04:42
Done.
| |
| 318 return NO_MARGINS; | 317 // as the paper size. |
| 319 else | 318 bool PDFShouldDisableScalingBasedOnPreset( |
| 320 return PRINTABLE_AREA_MARGINS; | 319 const blink::WebPrintPresetOptions& options, |
| 320 const PrintMsg_Print_Params& params) { | |
| 321 if (options.isScalingDisabled) | |
| 322 return true; | |
| 323 | |
| 324 if (!options.isPageSizeUniform) | |
| 325 return false; | |
| 326 | |
| 327 int dpi = GetDPI(¶ms); | |
| 328 blink::WebSize page_size( | |
| 329 ConvertUnit(params.page_size.width(), dpi, kPointsPerInch), | |
| 330 ConvertUnit(params.page_size.height(), dpi, kPointsPerInch)); | |
| 331 return options.uniformPageSize == page_size; | |
| 332 } | |
| 333 | |
| 334 bool PDFShouldDisableScaling(blink::WebLocalFrame* frame, | |
| 335 const blink::WebNode& node, | |
| 336 const PrintMsg_Print_Params& params) { | |
| 337 const bool kDefaultPDFShouldDisableScalingSetting = true; | |
| 338 blink::WebPrintPresetOptions preset_options; | |
| 339 if (!frame->getPrintPresetOptionsForPlugin(node, &preset_options)) | |
| 340 return kDefaultPDFShouldDisableScalingSetting; | |
| 341 return PDFShouldDisableScalingBasedOnPreset(preset_options, params); | |
| 342 } | |
| 343 | |
| 344 MarginType GetMarginsForPdf(blink::WebLocalFrame* frame, | |
| 345 const blink::WebNode& node, | |
| 346 const PrintMsg_Print_Params& params) { | |
| 347 return PDFShouldDisableScaling(frame, node, params) ? | |
| 348 NO_MARGINS : PRINTABLE_AREA_MARGINS; | |
| 321 } | 349 } |
| 322 | 350 |
| 323 bool FitToPageEnabled(const base::DictionaryValue& job_settings) { | 351 bool FitToPageEnabled(const base::DictionaryValue& job_settings) { |
| 324 bool fit_to_paper_size = false; | 352 bool fit_to_paper_size = false; |
| 325 if (!job_settings.GetBoolean(kSettingFitToPageEnabled, &fit_to_paper_size)) { | 353 if (!job_settings.GetBoolean(kSettingFitToPageEnabled, &fit_to_paper_size)) { |
| 326 NOTREACHED(); | 354 NOTREACHED(); |
| 327 } | 355 } |
| 328 return fit_to_paper_size; | 356 return fit_to_paper_size; |
| 329 } | 357 } |
| 330 | 358 |
| 331 // Returns the print scaling option to retain/scale/crop the source page size | 359 // Returns the print scaling option to retain/scale/crop the source page size |
| 332 // to fit the printable area of the paper. | 360 // to fit the printable area of the paper. |
| 333 // | 361 // |
| 334 // We retain the source page size when the current destination printer is | 362 // We retain the source page size when the current destination printer is |
| 335 // SAVE_AS_PDF. | 363 // SAVE_AS_PDF. |
| 336 // | 364 // |
| 337 // We crop the source page size to fit the printable area or we print only the | 365 // We crop the source page size to fit the printable area or we print only the |
| 338 // left top page contents when | 366 // left top page contents when |
| 339 // (1) Source is PDF and the user has requested not to fit to printable area | 367 // (1) Source is PDF and the user has requested not to fit to printable area |
| 340 // via |job_settings|. | 368 // via |job_settings|. |
| 341 // (2) Source is PDF. This is the first preview request and print scaling | 369 // (2) Source is PDF. This is the first preview request and print scaling |
| 342 // option is disabled for initiator renderer plugin. | 370 // option is disabled for initiator renderer plugin. |
| 343 // | 371 // |
| 344 // In all other cases, we scale the source page to fit the printable area. | 372 // In all other cases, we scale the source page to fit the printable area. |
| 345 blink::WebPrintScalingOption GetPrintScalingOption( | 373 blink::WebPrintScalingOption GetPrintScalingOption( |
| 346 blink::WebFrame* frame, | 374 blink::WebLocalFrame* frame, |
| 347 const blink::WebNode& node, | 375 const blink::WebNode& node, |
| 348 bool source_is_html, | 376 bool source_is_html, |
| 349 const base::DictionaryValue& job_settings, | 377 const base::DictionaryValue& job_settings, |
| 350 const PrintMsg_Print_Params& params) { | 378 const PrintMsg_Print_Params& params) { |
| 351 if (params.print_to_pdf) | 379 if (params.print_to_pdf) |
| 352 return blink::WebPrintScalingOptionSourceSize; | 380 return blink::WebPrintScalingOptionSourceSize; |
| 353 | 381 |
| 354 if (!source_is_html) { | 382 if (!source_is_html) { |
| 355 if (!FitToPageEnabled(job_settings)) | 383 if (!FitToPageEnabled(job_settings)) |
| 356 return blink::WebPrintScalingOptionNone; | 384 return blink::WebPrintScalingOptionNone; |
| 357 | 385 |
| 358 bool no_plugin_scaling = frame->isPrintScalingDisabledForPlugin(node); | 386 bool no_plugin_scaling = PDFShouldDisableScaling(frame, node, params); |
| 359 | |
| 360 if (params.is_first_request && no_plugin_scaling) | 387 if (params.is_first_request && no_plugin_scaling) |
| 361 return blink::WebPrintScalingOptionNone; | 388 return blink::WebPrintScalingOptionNone; |
| 362 } | 389 } |
| 363 return blink::WebPrintScalingOptionFitToPrintableArea; | 390 return blink::WebPrintScalingOptionFitToPrintableArea; |
| 364 } | 391 } |
| 365 | 392 |
| 366 PrintMsg_Print_Params CalculatePrintParamsForCss( | 393 PrintMsg_Print_Params CalculatePrintParamsForCss( |
| 367 blink::WebFrame* frame, | 394 blink::WebFrame* frame, |
| 368 int page_index, | 395 int page_index, |
| 369 const PrintMsg_Print_Params& page_params, | 396 const PrintMsg_Print_Params& page_params, |
| (...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1010 } | 1037 } |
| 1011 DidFinishPrinting(FAIL_PREVIEW); | 1038 DidFinishPrinting(FAIL_PREVIEW); |
| 1012 return; | 1039 return; |
| 1013 } | 1040 } |
| 1014 | 1041 |
| 1015 // Set the options from document if we are previewing a pdf and send a | 1042 // Set the options from document if we are previewing a pdf and send a |
| 1016 // message to browser. | 1043 // message to browser. |
| 1017 if (print_pages_params_->params.is_first_request && | 1044 if (print_pages_params_->params.is_first_request && |
| 1018 !print_preview_context_.IsModifiable()) { | 1045 !print_preview_context_.IsModifiable()) { |
| 1019 PrintHostMsg_SetOptionsFromDocument_Params options; | 1046 PrintHostMsg_SetOptionsFromDocument_Params options; |
| 1020 SetOptionsFromPdfDocument(&options); | 1047 if (SetOptionsFromPdfDocument(&options)) |
| 1021 Send(new PrintHostMsg_SetOptionsFromDocument(routing_id(), options)); | 1048 Send(new PrintHostMsg_SetOptionsFromDocument(routing_id(), options)); |
| 1022 } | 1049 } |
| 1023 | 1050 |
| 1024 is_print_ready_metafile_sent_ = false; | 1051 is_print_ready_metafile_sent_ = false; |
| 1025 | 1052 |
| 1026 // PDF printer device supports alpha blending. | 1053 // PDF printer device supports alpha blending. |
| 1027 print_pages_params_->params.supports_alpha_blend = true; | 1054 print_pages_params_->params.supports_alpha_blend = true; |
| 1028 | 1055 |
| 1029 bool generate_draft_pages = false; | 1056 bool generate_draft_pages = false; |
| 1030 if (!settings.GetBoolean(kSettingGenerateDraftData, &generate_draft_pages)) { | 1057 if (!settings.GetBoolean(kSettingGenerateDraftData, &generate_draft_pages)) { |
| 1031 NOTREACHED(); | 1058 NOTREACHED(); |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1436 } | 1463 } |
| 1437 | 1464 |
| 1438 const PrintMsg_Print_Params& params = print_pages_params_->params; | 1465 const PrintMsg_Print_Params& params = print_pages_params_->params; |
| 1439 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); | 1466 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); |
| 1440 prepare.StartPrinting(); | 1467 prepare.StartPrinting(); |
| 1441 | 1468 |
| 1442 *number_of_pages = prepare.GetExpectedPageCount(); | 1469 *number_of_pages = prepare.GetExpectedPageCount(); |
| 1443 return true; | 1470 return true; |
| 1444 } | 1471 } |
| 1445 | 1472 |
| 1446 void PrintWebViewHelper::SetOptionsFromPdfDocument( | 1473 bool PrintWebViewHelper::SetOptionsFromPdfDocument( |
| 1447 PrintHostMsg_SetOptionsFromDocument_Params* options) { | 1474 PrintHostMsg_SetOptionsFromDocument_Params* options) { |
| 1448 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame(); | 1475 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame(); |
| 1449 const blink::WebNode& source_node = print_preview_context_.source_node(); | 1476 const blink::WebNode& source_node = print_preview_context_.source_node(); |
| 1450 | 1477 |
| 1451 blink::WebPrintPresetOptions preset_options; | 1478 blink::WebPrintPresetOptions preset_options; |
| 1452 if (!source_frame->getPrintPresetOptionsForPlugin(source_node, | 1479 if (!source_frame->getPrintPresetOptionsForPlugin(source_node, |
| 1453 &preset_options)) { | 1480 &preset_options)) { |
| 1454 return; | 1481 return false; |
| 1455 } | 1482 } |
| 1456 | 1483 |
| 1457 options->is_scaling_disabled = preset_options.isScalingDisabled; | 1484 options->is_scaling_disabled = PDFShouldDisableScalingBasedOnPreset( |
| 1485 preset_options, print_pages_params_->params); | |
| 1458 options->copies = preset_options.copies; | 1486 options->copies = preset_options.copies; |
| 1459 | 1487 |
| 1460 // TODO(thestig) This should be a straight pass-through, but print preview | 1488 // TODO(thestig) This should be a straight pass-through, but print preview |
| 1461 // does not currently support short-edge printing. | 1489 // does not currently support short-edge printing. |
| 1462 switch (preset_options.duplexMode) { | 1490 switch (preset_options.duplexMode) { |
| 1463 case blink::WebSimplex: | 1491 case blink::WebSimplex: |
| 1464 options->duplex = SIMPLEX; | 1492 options->duplex = SIMPLEX; |
| 1465 break; | 1493 break; |
| 1466 case blink::WebLongEdge: | 1494 case blink::WebLongEdge: |
| 1467 options->duplex = LONG_EDGE; | 1495 options->duplex = LONG_EDGE; |
| 1468 break; | 1496 break; |
| 1469 default: | 1497 default: |
| 1470 options->duplex = UNKNOWN_DUPLEX_MODE; | 1498 options->duplex = UNKNOWN_DUPLEX_MODE; |
| 1471 break; | 1499 break; |
| 1472 } | 1500 } |
| 1501 return true; | |
| 1473 } | 1502 } |
| 1474 | 1503 |
| 1475 bool PrintWebViewHelper::UpdatePrintSettings( | 1504 bool PrintWebViewHelper::UpdatePrintSettings( |
| 1476 blink::WebLocalFrame* frame, | 1505 blink::WebLocalFrame* frame, |
| 1477 const blink::WebNode& node, | 1506 const blink::WebNode& node, |
| 1478 const base::DictionaryValue& passed_job_settings) { | 1507 const base::DictionaryValue& passed_job_settings) { |
| 1479 const base::DictionaryValue* job_settings = &passed_job_settings; | 1508 const base::DictionaryValue* job_settings = &passed_job_settings; |
| 1480 base::DictionaryValue modified_job_settings; | 1509 base::DictionaryValue modified_job_settings; |
| 1481 if (job_settings->empty()) { | 1510 if (job_settings->empty()) { |
| 1482 if (!print_for_preview_) | 1511 if (!print_for_preview_) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1543 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); | 1572 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); |
| 1544 else | 1573 else |
| 1545 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id())); | 1574 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id())); |
| 1546 | 1575 |
| 1547 return false; | 1576 return false; |
| 1548 } | 1577 } |
| 1549 | 1578 |
| 1550 return true; | 1579 return true; |
| 1551 } | 1580 } |
| 1552 | 1581 |
| 1553 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame, | 1582 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame, |
| 1554 const blink::WebNode& node, | 1583 const blink::WebNode& node, |
| 1555 int expected_pages_count, | 1584 int expected_pages_count, |
| 1556 bool is_scripted) { | 1585 bool is_scripted) { |
| 1557 PrintHostMsg_ScriptedPrint_Params params; | 1586 PrintHostMsg_ScriptedPrint_Params params; |
| 1558 PrintMsg_PrintPages_Params print_settings; | 1587 PrintMsg_PrintPages_Params print_settings; |
| 1559 | 1588 |
| 1560 params.cookie = print_pages_params_->params.document_cookie; | 1589 params.cookie = print_pages_params_->params.document_cookie; |
| 1561 params.has_selection = frame->hasSelection(); | 1590 params.has_selection = frame->hasSelection(); |
| 1562 params.expected_pages_count = expected_pages_count; | 1591 params.expected_pages_count = expected_pages_count; |
| 1563 MarginType margin_type = DEFAULT_MARGINS; | 1592 MarginType margin_type = DEFAULT_MARGINS; |
| 1564 if (PrintingNodeOrPdfFrame(frame, node)) | 1593 if (PrintingNodeOrPdfFrame(frame, node)) { |
| 1565 margin_type = GetMarginsForPdf(frame, node); | 1594 margin_type = |
| 1595 GetMarginsForPdf(frame, node, print_pages_params_->params); | |
| 1596 } | |
| 1566 params.margin_type = margin_type; | 1597 params.margin_type = margin_type; |
| 1567 params.is_scripted = is_scripted; | 1598 params.is_scripted = is_scripted; |
| 1568 | 1599 |
| 1569 Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); | 1600 Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); |
| 1570 | 1601 |
| 1571 // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the | 1602 // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the |
| 1572 // value before and restore it afterwards. | 1603 // value before and restore it afterwards. |
| 1573 blink::WebPrintScalingOption scaling_option = | 1604 blink::WebPrintScalingOption scaling_option = |
| 1574 print_pages_params_->params.print_scaling_option; | 1605 print_pages_params_->params.print_scaling_option; |
| 1575 | 1606 |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2034 blink::WebConsoleMessage::LevelWarning, message)); | 2065 blink::WebConsoleMessage::LevelWarning, message)); |
| 2035 return false; | 2066 return false; |
| 2036 } | 2067 } |
| 2037 | 2068 |
| 2038 void PrintWebViewHelper::ScriptingThrottler::Reset() { | 2069 void PrintWebViewHelper::ScriptingThrottler::Reset() { |
| 2039 // Reset counter on successful print. | 2070 // Reset counter on successful print. |
| 2040 count_ = 0; | 2071 count_ = 0; |
| 2041 } | 2072 } |
| 2042 | 2073 |
| 2043 } // namespace printing | 2074 } // namespace printing |
| OLD | NEW |