Chromium Code Reviews

Side by Side Diff: chrome/renderer/printing/print_web_view_helper.cc

Issue 480303002: Use document from preview for System Dialog printing on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Tue 08/19/2014 11:17:57.84 Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
OLDNEW
1 // Use of this source code is governed by a BSD-style license that can be
Noam Samuel 2014/08/20 00:04:17 ??? Pretty sure this line doesn't need to be moved
Vitaly Buka (NO REVIEWS) 2014/08/20 02:42:55 Done.
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // 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
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/printing/print_web_view_helper.h" 5 #include "chrome/renderer/printing/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/command_line.h" 10 #include "base/command_line.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
(...skipping 71 matching lines...)
84 return kPointsPerInch; 84 return kPointsPerInch;
85 #else 85 #else
86 return static_cast<int>(print_params->dpi); 86 return static_cast<int>(print_params->dpi);
87 #endif // defined(OS_MACOSX) 87 #endif // defined(OS_MACOSX)
88 } 88 }
89 89
90 bool PrintMsg_Print_Params_IsValid(const PrintMsg_Print_Params& params) { 90 bool PrintMsg_Print_Params_IsValid(const PrintMsg_Print_Params& params) {
91 return !params.content_size.IsEmpty() && !params.page_size.IsEmpty() && 91 return !params.content_size.IsEmpty() && !params.page_size.IsEmpty() &&
92 !params.printable_area.IsEmpty() && params.document_cookie && 92 !params.printable_area.IsEmpty() && params.document_cookie &&
93 params.desired_dpi && params.max_shrink && params.min_shrink && 93 params.desired_dpi && params.max_shrink && params.min_shrink &&
94 params.dpi && (params.margin_top >= 0) && (params.margin_left >= 0); 94 params.dpi && (params.margin_top >= 0) && (params.margin_left >= 0) &&
95 params.dpi > kMinDpi && params.document_cookie != 0;
95 } 96 }
96 97
97 PrintMsg_Print_Params GetCssPrintParams( 98 PrintMsg_Print_Params GetCssPrintParams(
98 blink::WebFrame* frame, 99 blink::WebFrame* frame,
99 int page_index, 100 int page_index,
100 const PrintMsg_Print_Params& page_params) { 101 const PrintMsg_Print_Params& page_params) {
101 PrintMsg_Print_Params page_css_params = page_params; 102 PrintMsg_Print_Params page_css_params = page_params;
102 int dpi = GetDPI(&page_params); 103 int dpi = GetDPI(&page_params);
103 104
104 blink::WebSize page_size_in_pixels( 105 blink::WebSize page_size_in_pixels(
(...skipping 908 matching lines...)
1013 if (!print_preview_context_.source_frame()) { 1014 if (!print_preview_context_.source_frame()) {
1014 DidFinishPrinting(FAIL_PREVIEW); 1015 DidFinishPrinting(FAIL_PREVIEW);
1015 return; 1016 return;
1016 } 1017 }
1017 1018
1018 if (!UpdatePrintSettings(print_preview_context_.source_frame(), 1019 if (!UpdatePrintSettings(print_preview_context_.source_frame(),
1019 print_preview_context_.source_node(), settings)) { 1020 print_preview_context_.source_node(), settings)) {
1020 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { 1021 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) {
1021 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 1022 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings(
1022 routing_id(), 1023 routing_id(),
1023 print_pages_params_ ? 1024 print_pages_params() ? print_pages_params()->params.document_cookie
1024 print_pages_params_->params.document_cookie : 0)); 1025 : 0));
1025 notify_browser_of_print_failure_ = false; // Already sent. 1026 notify_browser_of_print_failure_ = false; // Already sent.
1026 } 1027 }
1027 DidFinishPrinting(FAIL_PREVIEW); 1028 DidFinishPrinting(FAIL_PREVIEW);
1028 return; 1029 return;
1029 } 1030 }
1030 1031
1031 // Set the options from document if we are previewing a pdf and send a 1032 // Set the options from document if we are previewing a pdf and send a
1032 // message to browser. 1033 // message to browser.
1033 if (print_pages_params_->params.is_first_request && 1034 if (print_pages_params()->params.is_first_request &&
1034 !print_preview_context_.IsModifiable()) { 1035 !print_preview_context_.IsModifiable()) {
1035 PrintHostMsg_SetOptionsFromDocument_Params params; 1036 PrintHostMsg_SetOptionsFromDocument_Params params;
1036 SetOptionsFromDocument(params); 1037 SetOptionsFromDocument(params);
1037 Send(new PrintHostMsg_SetOptionsFromDocument(routing_id(), params)); 1038 Send(new PrintHostMsg_SetOptionsFromDocument(routing_id(), params));
1038 } 1039 }
1039 1040
1040 is_print_ready_metafile_sent_ = false; 1041 is_print_ready_metafile_sent_ = false;
1041 1042
1042 // PDF printer device supports alpha blending. 1043 // PDF printer device supports alpha blending.
1043 print_pages_params_->params.supports_alpha_blend = true; 1044 print_pages_params_->params.supports_alpha_blend = true;
1044 1045
1045 bool generate_draft_pages = false; 1046 bool generate_draft_pages = false;
1046 if (!settings.GetBoolean(kSettingGenerateDraftData, 1047 if (!settings.GetBoolean(kSettingGenerateDraftData,
1047 &generate_draft_pages)) { 1048 &generate_draft_pages)) {
1048 NOTREACHED(); 1049 NOTREACHED();
1049 } 1050 }
1050 print_preview_context_.set_generate_draft_pages(generate_draft_pages); 1051 print_preview_context_.set_generate_draft_pages(generate_draft_pages);
1051 1052
1052 PrepareFrameForPreviewDocument(); 1053 PrepareFrameForPreviewDocument();
1053 } 1054 }
1054 1055
1055 void PrintWebViewHelper::PrepareFrameForPreviewDocument() { 1056 void PrintWebViewHelper::PrepareFrameForPreviewDocument() {
1056 reset_prep_frame_view_ = false; 1057 reset_prep_frame_view_ = false;
1057 1058
1058 if (!print_pages_params_ || CheckForCancel()) { 1059 if (!print_pages_params() || CheckForCancel()) {
1059 DidFinishPrinting(FAIL_PREVIEW); 1060 DidFinishPrinting(FAIL_PREVIEW);
1060 return; 1061 return;
1061 } 1062 }
1062 1063
1063 // Don't reset loading frame or WebKit will fail assert. Just retry when 1064 // Don't reset loading frame or WebKit will fail assert. Just retry when
1064 // current selection is loaded. 1065 // current selection is loaded.
1065 if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) { 1066 if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) {
1066 reset_prep_frame_view_ = true; 1067 reset_prep_frame_view_ = true;
1067 return; 1068 return;
1068 } 1069 }
1069 1070
1070 const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1071 const PrintMsg_Print_Params& print_params = print_pages_params()->params;
1071 prep_frame_view_.reset( 1072 prep_frame_view_.reset(
1072 new PrepareFrameAndViewForPrint(print_params, 1073 new PrepareFrameAndViewForPrint(print_params,
1073 print_preview_context_.source_frame(), 1074 print_preview_context_.source_frame(),
1074 print_preview_context_.source_node(), 1075 print_preview_context_.source_node(),
1075 ignore_css_margins_)); 1076 ignore_css_margins_));
1076 prep_frame_view_->CopySelectionIfNeeded( 1077 prep_frame_view_->CopySelectionIfNeeded(
1077 render_view()->GetWebkitPreferences(), 1078 render_view()->GetWebkitPreferences(),
1078 base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, 1079 base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument,
1079 base::Unretained(this))); 1080 base::Unretained(this)));
1080 } 1081 }
1081 1082
1082 void PrintWebViewHelper::OnFramePreparedForPreviewDocument() { 1083 void PrintWebViewHelper::OnFramePreparedForPreviewDocument() {
1083 if (reset_prep_frame_view_) { 1084 if (reset_prep_frame_view_) {
1084 PrepareFrameForPreviewDocument(); 1085 PrepareFrameForPreviewDocument();
1085 return; 1086 return;
1086 } 1087 }
1087 DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW); 1088 DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW);
1088 } 1089 }
1089 1090
1090 bool PrintWebViewHelper::CreatePreviewDocument() { 1091 bool PrintWebViewHelper::CreatePreviewDocument() {
1091 if (!print_pages_params_ || CheckForCancel()) 1092 if (!print_pages_params() || CheckForCancel())
1092 return false; 1093 return false;
1093 1094
1094 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 1095 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent",
1095 PREVIEW_EVENT_CREATE_DOCUMENT, PREVIEW_EVENT_MAX); 1096 PREVIEW_EVENT_CREATE_DOCUMENT, PREVIEW_EVENT_MAX);
1096 1097
1097 const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1098 const PrintMsg_Print_Params& print_params = print_pages_params()->params;
1098 const std::vector<int>& pages = print_pages_params_->pages; 1099 const std::vector<int>& pages = print_pages_params()->pages;
1099 1100
1100 if (!print_preview_context_.CreatePreviewDocument(prep_frame_view_.release(), 1101 if (!print_preview_context_.CreatePreviewDocument(prep_frame_view_.release(),
1101 pages)) { 1102 pages)) {
1102 return false; 1103 return false;
1103 } 1104 }
1104 1105
1105 PageSizeMargins default_page_layout; 1106 PageSizeMargins default_page_layout;
1106 ComputePageLayoutInPointsForCss(print_preview_context_.prepared_frame(), 0, 1107 ComputePageLayoutInPointsForCss(print_preview_context_.prepared_frame(), 0,
1107 print_params, ignore_css_margins_, NULL, 1108 print_params, ignore_css_margins_, NULL,
1108 &default_page_layout); 1109 &default_page_layout);
(...skipping 59 matching lines...)
1168 DCHECK(!is_print_ready_metafile_sent_); 1169 DCHECK(!is_print_ready_metafile_sent_);
1169 print_preview_context_.FinalizePrintReadyDocument(); 1170 print_preview_context_.FinalizePrintReadyDocument();
1170 1171
1171 // Get the size of the resulting metafile. 1172 // Get the size of the resulting metafile.
1172 PreviewMetafile* metafile = print_preview_context_.metafile(); 1173 PreviewMetafile* metafile = print_preview_context_.metafile();
1173 uint32 buf_size = metafile->GetDataSize(); 1174 uint32 buf_size = metafile->GetDataSize();
1174 DCHECK_GT(buf_size, 0u); 1175 DCHECK_GT(buf_size, 0u);
1175 1176
1176 PrintHostMsg_DidPreviewDocument_Params preview_params; 1177 PrintHostMsg_DidPreviewDocument_Params preview_params;
1177 preview_params.data_size = buf_size; 1178 preview_params.data_size = buf_size;
1178 preview_params.document_cookie = print_pages_params_->params.document_cookie; 1179 preview_params.document_cookie = print_pages_params()->params.document_cookie;
1179 preview_params.expected_pages_count = 1180 preview_params.expected_pages_count =
1180 print_preview_context_.total_page_count(); 1181 print_preview_context_.total_page_count();
1181 preview_params.modifiable = print_preview_context_.IsModifiable(); 1182 preview_params.modifiable = print_preview_context_.IsModifiable();
1182 preview_params.preview_request_id = 1183 preview_params.preview_request_id =
1183 print_pages_params_->params.preview_request_id; 1184 print_pages_params()->params.preview_request_id;
1184 1185
1185 // Ask the browser to create the shared memory for us. 1186 // Ask the browser to create the shared memory for us.
1186 if (!CopyMetafileDataToSharedMem(metafile, 1187 if (!CopyMetafileDataToSharedMem(metafile,
1187 &(preview_params.metafile_data_handle))) { 1188 &(preview_params.metafile_data_handle))) {
1188 LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1189 LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
1189 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1190 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
1190 return false; 1191 return false;
1191 } 1192 }
1192 is_print_ready_metafile_sent_ = true; 1193 is_print_ready_metafile_sent_ = true;
1193 1194
(...skipping 96 matching lines...)
1290 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 1291 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
1291 switch (result) { 1292 switch (result) {
1292 case OK: 1293 case OK:
1293 break; 1294 break;
1294 1295
1295 case FAIL_PRINT_INIT: 1296 case FAIL_PRINT_INIT:
1296 DCHECK(!notify_browser_of_print_failure_); 1297 DCHECK(!notify_browser_of_print_failure_);
1297 break; 1298 break;
1298 1299
1299 case FAIL_PRINT: 1300 case FAIL_PRINT:
1300 if (notify_browser_of_print_failure_ && print_pages_params_) { 1301 if (notify_browser_of_print_failure_ && print_pages_params()) {
1301 int cookie = print_pages_params_->params.document_cookie; 1302 int cookie = print_pages_params()->params.document_cookie;
1302 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 1303 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
1303 } 1304 }
1304 break; 1305 break;
1305 1306
1306 case FAIL_PREVIEW: 1307 case FAIL_PREVIEW:
1307 DCHECK(is_preview_enabled_); 1308 DCHECK(is_preview_enabled_);
1308 int cookie = print_pages_params_ ? 1309 int cookie = print_pages_params()
1309 print_pages_params_->params.document_cookie : 0; 1310 ? print_pages_params()->params.document_cookie
1311 : 0;
1310 if (notify_browser_of_print_failure_) { 1312 if (notify_browser_of_print_failure_) {
1311 LOG(ERROR) << "CreatePreviewDocument failed"; 1313 LOG(ERROR) << "CreatePreviewDocument failed";
1312 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 1314 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
1313 } else { 1315 } else {
1314 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 1316 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie));
1315 } 1317 }
1316 print_preview_context_.Failed(notify_browser_of_print_failure_); 1318 print_preview_context_.Failed(notify_browser_of_print_failure_);
1317 break; 1319 break;
1318 } 1320 }
1319 prep_frame_view_.reset(); 1321 prep_frame_view_.reset();
(...skipping 10 matching lines...)
1330 if (!prep_frame_view_) // Printing is already canceled or failed. 1332 if (!prep_frame_view_) // Printing is already canceled or failed.
1331 return; 1333 return;
1332 prep_frame_view_->StartPrinting(); 1334 prep_frame_view_->StartPrinting();
1333 1335
1334 int page_count = prep_frame_view_->GetExpectedPageCount(); 1336 int page_count = prep_frame_view_->GetExpectedPageCount();
1335 if (!page_count) { 1337 if (!page_count) {
1336 LOG(ERROR) << "Can't print 0 pages."; 1338 LOG(ERROR) << "Can't print 0 pages.";
1337 return DidFinishPrinting(FAIL_PRINT); 1339 return DidFinishPrinting(FAIL_PRINT);
1338 } 1340 }
1339 1341
1340 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1342 const PrintMsg_PrintPages_Params& params = *print_pages_params();
1341 const PrintMsg_Print_Params& print_params = params.params; 1343 const PrintMsg_Print_Params& print_params = params.params;
1342 1344
1343 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1345 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
1344 // TODO(vitalybuka): should be page_count or valid pages from params.pages. 1346 // TODO(vitalybuka): should be page_count or valid pages from params.pages.
1345 // See http://crbug.com/161576 1347 // See http://crbug.com/161576
1346 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 1348 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
1347 print_params.document_cookie, 1349 print_params.document_cookie,
1348 page_count)); 1350 page_count));
1349 #endif // !defined(OS_CHROMEOS) 1351 #endif // !defined(OS_CHROMEOS)
1350 1352
(...skipping 18 matching lines...)
1369 1371
1370 void PrintWebViewHelper::FinishFramePrinting() { 1372 void PrintWebViewHelper::FinishFramePrinting() {
1371 prep_frame_view_.reset(); 1373 prep_frame_view_.reset();
1372 } 1374 }
1373 1375
1374 #if defined(OS_MACOSX) || \ 1376 #if defined(OS_MACOSX) || \
1375 (defined(OS_WIN) && !defined(WIN_PDF_METAFILE_FOR_PRINTING)) 1377 (defined(OS_WIN) && !defined(WIN_PDF_METAFILE_FOR_PRINTING))
1376 bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame, 1378 bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
1377 int page_count, 1379 int page_count,
1378 const gfx::Size& canvas_size) { 1380 const gfx::Size& canvas_size) {
1379 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1381 const PrintMsg_PrintPages_Params& params = *print_pages_params();
1380 const PrintMsg_Print_Params& print_params = params.params; 1382 const PrintMsg_Print_Params& print_params = params.params;
1381 1383
1382 PrintMsg_PrintPage_Params page_params; 1384 PrintMsg_PrintPage_Params page_params;
1383 page_params.params = print_params; 1385 page_params.params = print_params;
1384 if (params.pages.empty()) { 1386 if (params.pages.empty()) {
1385 for (int i = 0; i < page_count; ++i) { 1387 for (int i = 0; i < page_count; ++i) {
1386 page_params.page_number = i; 1388 page_params.page_number = i;
1387 PrintPageInternal(page_params, canvas_size, frame); 1389 PrintPageInternal(page_params, canvas_size, frame);
1388 } 1390 }
1389 } else { 1391 } else {
(...skipping 29 matching lines...)
1419 PrintMsg_PrintPages_Params settings; 1421 PrintMsg_PrintPages_Params settings;
1420 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 1422 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
1421 &settings.params)); 1423 &settings.params));
1422 // Check if the printer returned any settings, if the settings is empty, we 1424 // Check if the printer returned any settings, if the settings is empty, we
1423 // can safely assume there are no printer drivers configured. So we safely 1425 // can safely assume there are no printer drivers configured. So we safely
1424 // terminate. 1426 // terminate.
1425 bool result = true; 1427 bool result = true;
1426 if (!PrintMsg_Print_Params_IsValid(settings.params)) 1428 if (!PrintMsg_Print_Params_IsValid(settings.params))
1427 result = false; 1429 result = false;
1428 1430
1429 if (result &&
1430 (settings.params.dpi < kMinDpi || settings.params.document_cookie == 0)) {
1431 // Invalid print page settings.
1432 NOTREACHED();
1433 result = false;
1434 }
1435
1436 // Reset to default values. 1431 // Reset to default values.
1437 ignore_css_margins_ = false; 1432 ignore_css_margins_ = false;
1438 settings.pages.clear(); 1433 settings.pages.clear();
1439 1434
1440 settings.params.print_scaling_option = 1435 settings.params.print_scaling_option =
1441 blink::WebPrintScalingOptionSourceSize; 1436 blink::WebPrintScalingOptionSourceSize;
1442 if (fit_to_paper_size) { 1437 if (fit_to_paper_size) {
1443 settings.params.print_scaling_option = 1438 settings.params.print_scaling_option =
1444 blink::WebPrintScalingOptionFitToPrintableArea; 1439 blink::WebPrintScalingOptionFitToPrintableArea;
1445 } 1440 }
1446 1441
1447 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1442 SetPrintPagesParams(settings);
1448 return result; 1443 return result;
1449 } 1444 }
1450 1445
1451 bool PrintWebViewHelper::CalculateNumberOfPages(blink::WebLocalFrame* frame, 1446 bool PrintWebViewHelper::CalculateNumberOfPages(blink::WebLocalFrame* frame,
1452 const blink::WebNode& node, 1447 const blink::WebNode& node,
1453 int* number_of_pages) { 1448 int* number_of_pages) {
1454 DCHECK(frame); 1449 DCHECK(frame);
1455 bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node)); 1450 bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node));
1456 if (!InitPrintSettings(fit_to_paper_size)) { 1451 if (!InitPrintSettings(fit_to_paper_size)) {
1457 notify_browser_of_print_failure_ = false; 1452 notify_browser_of_print_failure_ = false;
1458 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id())); 1453 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id()));
1459 return false; 1454 return false;
1460 } 1455 }
1461 1456
1462 const PrintMsg_Print_Params& params = print_pages_params_->params; 1457 const PrintMsg_Print_Params& params = print_pages_params()->params;
1463 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); 1458 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_);
1464 prepare.StartPrinting(); 1459 prepare.StartPrinting();
1465 1460
1466 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(),
1467 params.document_cookie));
1468 *number_of_pages = prepare.GetExpectedPageCount(); 1461 *number_of_pages = prepare.GetExpectedPageCount();
1469 return true; 1462 return true;
1470 } 1463 }
1471 1464
1472 void PrintWebViewHelper::SetOptionsFromDocument( 1465 void PrintWebViewHelper::SetOptionsFromDocument(
1473 PrintHostMsg_SetOptionsFromDocument_Params& params) { 1466 PrintHostMsg_SetOptionsFromDocument_Params& params) {
1474 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame(); 1467 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame();
1475 const blink::WebNode& source_node = print_preview_context_.source_node(); 1468 const blink::WebNode& source_node = print_preview_context_.source_node();
1476 1469
1477 params.is_scaling_disabled = 1470 params.is_scaling_disabled =
(...skipping 24 matching lines...)
1502 1495
1503 if (print_for_preview_ || !source_is_html) { 1496 if (print_for_preview_ || !source_is_html) {
1504 modified_job_settings.MergeDictionary(job_settings); 1497 modified_job_settings.MergeDictionary(job_settings);
1505 modified_job_settings.SetBoolean(kSettingHeaderFooterEnabled, false); 1498 modified_job_settings.SetBoolean(kSettingHeaderFooterEnabled, false);
1506 modified_job_settings.SetInteger(kSettingMarginsType, NO_MARGINS); 1499 modified_job_settings.SetInteger(kSettingMarginsType, NO_MARGINS);
1507 job_settings = &modified_job_settings; 1500 job_settings = &modified_job_settings;
1508 } 1501 }
1509 1502
1510 // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when 1503 // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when
1511 // possible. 1504 // possible.
1512 int cookie = print_pages_params_ ? 1505 int cookie =
1513 print_pages_params_->params.document_cookie : 0; 1506 print_pages_params() ? print_pages_params()->params.document_cookie : 0;
1514 PrintMsg_PrintPages_Params settings; 1507 PrintMsg_PrintPages_Params settings;
1515 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), cookie, *job_settings, 1508 bool canceled = false;
1516 &settings)); 1509 Send(new PrintHostMsg_UpdatePrintSettings(
1517 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1510 routing_id(), cookie, *job_settings, &settings, &canceled));
1518 1511 if (canceled) {
1519 if (!PrintMsg_Print_Params_IsValid(settings.params)) { 1512 notify_browser_of_print_failure_ = false;
1520 if (!print_for_preview_)
1521 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS);
1522 else
1523 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id()));
1524
1525 return false; 1513 return false;
1526 } 1514 }
1527 1515
1528 if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) {
1529 print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS);
1530 return false;
1531 }
1532
1533 if (!job_settings->GetInteger(kPreviewUIID, &settings.params.preview_ui_id)) { 1516 if (!job_settings->GetInteger(kPreviewUIID, &settings.params.preview_ui_id)) {
1534 NOTREACHED(); 1517 NOTREACHED();
1535 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1518 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING);
1536 return false; 1519 return false;
1537 } 1520 }
1538 1521
1539 if (!print_for_preview_) { 1522 if (!print_for_preview_) {
1540 // Validate expected print preview settings. 1523 // Validate expected print preview settings.
1541 if (!job_settings->GetInteger(kPreviewRequestID, 1524 if (!job_settings->GetInteger(kPreviewRequestID,
1542 &settings.params.preview_request_id) || 1525 &settings.params.preview_request_id) ||
1543 !job_settings->GetBoolean(kIsFirstRequest, 1526 !job_settings->GetBoolean(kIsFirstRequest,
1544 &settings.params.is_first_request)) { 1527 &settings.params.is_first_request)) {
1545 NOTREACHED(); 1528 NOTREACHED();
1546 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1529 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING);
1547 return false; 1530 return false;
1548 } 1531 }
1532 }
1549 1533
1534 if (!print_for_preview_) {
Noam Samuel 2014/08/20 00:04:17 Why separate two of the same if?
Vitaly Buka (NO REVIEWS) 2014/08/20 02:42:55 Done.
1550 settings.params.print_to_pdf = IsPrintToPdfRequested(*job_settings); 1535 settings.params.print_to_pdf = IsPrintToPdfRequested(*job_settings);
1551 UpdateFrameMarginsCssInfo(*job_settings); 1536 UpdateFrameMarginsCssInfo(*job_settings);
1552 settings.params.print_scaling_option = GetPrintScalingOption( 1537 settings.params.print_scaling_option = GetPrintScalingOption(
1553 frame, node, source_is_html, *job_settings, settings.params); 1538 frame, node, source_is_html, *job_settings, settings.params);
1554 1539
1555 // Header/Footer: Set |header_footer_info_|. 1540 // Header/Footer: Set |header_footer_info_|.
1556 if (settings.params.display_header_footer) { 1541 if (settings.params.display_header_footer) {
1557 header_footer_info_.reset(new base::DictionaryValue()); 1542 header_footer_info_.reset(new base::DictionaryValue());
1558 header_footer_info_->SetDouble(kSettingHeaderFooterDate, 1543 header_footer_info_->SetDouble(kSettingHeaderFooterDate,
1559 base::Time::Now().ToJsTime()); 1544 base::Time::Now().ToJsTime());
1560 header_footer_info_->SetString(kSettingHeaderFooterURL, 1545 header_footer_info_->SetString(kSettingHeaderFooterURL,
1561 settings.params.url); 1546 settings.params.url);
1562 header_footer_info_->SetString(kSettingHeaderFooterTitle, 1547 header_footer_info_->SetString(kSettingHeaderFooterTitle,
1563 settings.params.title); 1548 settings.params.title);
1564 } 1549 }
1565 } 1550 }
1566 1551
1567 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1552 SetPrintPagesParams(settings);
1568 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), 1553
1569 settings.params.document_cookie)); 1554 if (CheckForCancel())
1555 return false;
1556
1557 if (!PrintMsg_Print_Params_IsValid(settings.params)) {
1558 if (!print_for_preview_)
1559 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS);
1560 else
1561 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id()));
1562
1563 return false;
1564 }
1570 1565
1571 return true; 1566 return true;
1572 } 1567 }
1573 1568
1574 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame, 1569 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame,
1575 const blink::WebNode& node, 1570 const blink::WebNode& node,
1576 int expected_pages_count) { 1571 int expected_pages_count) {
1577 PrintHostMsg_ScriptedPrint_Params params; 1572 PrintHostMsg_ScriptedPrint_Params params;
1578 PrintMsg_PrintPages_Params print_settings; 1573 PrintMsg_PrintPages_Params print_settings;
1579 1574
1580 params.cookie = print_pages_params_->params.document_cookie; 1575 params.cookie = print_pages_params()->params.document_cookie;
1581 params.has_selection = frame->hasSelection(); 1576 params.has_selection = frame->hasSelection();
1582 params.expected_pages_count = expected_pages_count; 1577 params.expected_pages_count = expected_pages_count;
1583 MarginType margin_type = DEFAULT_MARGINS; 1578 MarginType margin_type = DEFAULT_MARGINS;
1584 if (PrintingNodeOrPdfFrame(frame, node)) 1579 if (PrintingNodeOrPdfFrame(frame, node))
1585 margin_type = GetMarginsForPdf(frame, node); 1580 margin_type = GetMarginsForPdf(frame, node);
1586 params.margin_type = margin_type; 1581 params.margin_type = margin_type;
1587 1582
1588 Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); 1583 Send(new PrintHostMsg_DidShowPrintDialog(routing_id()));
1589 1584
1590 // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the 1585 // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the
1591 // value before and restore it afterwards. 1586 // value before and restore it afterwards.
1592 blink::WebPrintScalingOption scaling_option = 1587 blink::WebPrintScalingOption scaling_option =
1593 print_pages_params_->params.print_scaling_option; 1588 print_pages_params()->params.print_scaling_option;
1594 1589
1595 print_pages_params_.reset(); 1590 print_pages_params_.reset();
1596 IPC::SyncMessage* msg = 1591 IPC::SyncMessage* msg =
1597 new PrintHostMsg_ScriptedPrint(routing_id(), params, &print_settings); 1592 new PrintHostMsg_ScriptedPrint(routing_id(), params, &print_settings);
1598 msg->EnableMessagePumping(); 1593 msg->EnableMessagePumping();
1599 Send(msg); 1594 Send(msg);
1600 print_pages_params_.reset(new PrintMsg_PrintPages_Params(print_settings)); 1595 print_settings.params.print_scaling_option = scaling_option;
1601 1596 SetPrintPagesParams(print_settings);
1602 print_pages_params_->params.print_scaling_option = scaling_option;
1603 return (print_settings.params.dpi && print_settings.params.document_cookie); 1597 return (print_settings.params.dpi && print_settings.params.document_cookie);
1604 } 1598 }
1605 1599
1606 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, 1600 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame,
1607 const blink::WebNode& node) { 1601 const blink::WebNode& node) {
1608 if (!frame || prep_frame_view_) 1602 if (!frame || prep_frame_view_)
1609 return false; 1603 return false;
1610 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1604 const PrintMsg_PrintPages_Params& params = *print_pages_params();
1611 const PrintMsg_Print_Params& print_params = params.params; 1605 const PrintMsg_Print_Params& print_params = params.params;
1612 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( 1606 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(
1613 print_params, frame, node, ignore_css_margins_)); 1607 print_params, frame, node, ignore_css_margins_));
1614 DCHECK(!print_pages_params_->params.selection_only || 1608 DCHECK(!print_pages_params()->params.selection_only ||
1615 print_pages_params_->pages.empty()); 1609 print_pages_params()->pages.empty());
1616 prep_frame_view_->CopySelectionIfNeeded( 1610 prep_frame_view_->CopySelectionIfNeeded(
1617 render_view()->GetWebkitPreferences(), 1611 render_view()->GetWebkitPreferences(),
1618 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, 1612 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages,
1619 base::Unretained(this))); 1613 base::Unretained(this)));
1620 return true; 1614 return true;
1621 } 1615 }
1622 1616
1623 #if defined(OS_POSIX) 1617 #if defined(OS_POSIX)
1624 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 1618 bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
1625 Metafile* metafile, 1619 Metafile* metafile,
(...skipping 138 matching lines...)
1764 } 1758 }
1765 default: { 1759 default: {
1766 NOTREACHED(); 1760 NOTREACHED();
1767 return; 1761 return;
1768 } 1762 }
1769 } 1763 }
1770 Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params)); 1764 Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params));
1771 } 1765 }
1772 1766
1773 bool PrintWebViewHelper::CheckForCancel() { 1767 bool PrintWebViewHelper::CheckForCancel() {
1774 const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1768 const PrintMsg_Print_Params& print_params = print_pages_params()->params;
1775 bool cancel = false; 1769 bool cancel = false;
1776 Send(new PrintHostMsg_CheckForCancel(routing_id(), 1770 Send(new PrintHostMsg_CheckForCancel(routing_id(),
1777 print_params.preview_ui_id, 1771 print_params.preview_ui_id,
1778 print_params.preview_request_id, 1772 print_params.preview_request_id,
1779 &cancel)); 1773 &cancel));
1780 if (cancel) 1774 if (cancel)
1781 notify_browser_of_print_failure_ = false; 1775 notify_browser_of_print_failure_ = false;
1782 return cancel; 1776 return cancel;
1783 } 1777 }
1784 1778
(...skipping 23 matching lines...)
1808 DCHECK_GT(buf_size, 0u); 1802 DCHECK_GT(buf_size, 0u);
1809 if (!CopyMetafileDataToSharedMem( 1803 if (!CopyMetafileDataToSharedMem(
1810 metafile, &(preview_page_params.metafile_data_handle))) { 1804 metafile, &(preview_page_params.metafile_data_handle))) {
1811 LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1805 LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
1812 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1806 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
1813 return false; 1807 return false;
1814 } 1808 }
1815 preview_page_params.data_size = buf_size; 1809 preview_page_params.data_size = buf_size;
1816 preview_page_params.page_number = page_number; 1810 preview_page_params.page_number = page_number;
1817 preview_page_params.preview_request_id = 1811 preview_page_params.preview_request_id =
1818 print_pages_params_->params.preview_request_id; 1812 print_pages_params()->params.preview_request_id;
1819 1813
1820 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1814 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1821 return true; 1815 return true;
1822 } 1816 }
1823 1817
1824 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1818 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1825 : total_page_count_(0), 1819 : total_page_count_(0),
1826 current_page_index_(0), 1820 current_page_index_(0),
1827 generate_draft_pages_(true), 1821 generate_draft_pages_(true),
1828 print_ready_metafile_page_count_(0), 1822 print_ready_metafile_page_count_(0),
(...skipping 227 matching lines...)
2056 return prep_frame_view_->GetPrintCanvasSize(); 2050 return prep_frame_view_->GetPrintCanvasSize();
2057 } 2051 }
2058 2052
2059 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 2053 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
2060 prep_frame_view_.reset(); 2054 prep_frame_view_.reset();
2061 metafile_.reset(); 2055 metafile_.reset();
2062 pages_to_render_.clear(); 2056 pages_to_render_.clear();
2063 error_ = PREVIEW_ERROR_NONE; 2057 error_ = PREVIEW_ERROR_NONE;
2064 } 2058 }
2065 2059
2060 void PrintWebViewHelper::SetPrintPagesParams(
2061 const PrintMsg_PrintPages_Params& settings) {
2062 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
2063 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(),
2064 settings.params.document_cookie));
2065 }
2066
2066 } // namespace printing 2067 } // namespace printing
OLDNEW

Powered by Google App Engine