| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/renderer/print_web_view_helper.h" | 5 #include "chrome/renderer/print_web_view_helper.h" |
| 6 | 6 |
| 7 #if defined(OS_MACOSX) && !defined(USE_SKIA) | 7 #if defined(OS_MACOSX) && !defined(USE_SKIA) |
| 8 #include <CoreGraphics/CGContext.h> | 8 #include <CoreGraphics/CGContext.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 } | 570 } |
| 571 | 571 |
| 572 WebFrame* pdf_frame = pdf_element.document().frame(); | 572 WebFrame* pdf_frame = pdf_element.document().frame(); |
| 573 scoped_ptr<PrepareFrameAndViewForPrint> prepare; | 573 scoped_ptr<PrepareFrameAndViewForPrint> prepare; |
| 574 if (!InitPrintSettingsAndPrepareFrame(pdf_frame, &pdf_element, &prepare)) { | 574 if (!InitPrintSettingsAndPrepareFrame(pdf_frame, &pdf_element, &prepare)) { |
| 575 NOTREACHED() << "Failed to initialize print page settings"; | 575 NOTREACHED() << "Failed to initialize print page settings"; |
| 576 return; | 576 return; |
| 577 } | 577 } |
| 578 | 578 |
| 579 if (!UpdatePrintSettings(job_settings, false)) { | 579 if (!UpdatePrintSettings(job_settings, false)) { |
| 580 LOG(ERROR) << "UpdatePrintSettings failed"; |
| 580 DidFinishPrinting(FAIL_PRINT); | 581 DidFinishPrinting(FAIL_PRINT); |
| 581 return; | 582 return; |
| 582 } | 583 } |
| 583 | 584 |
| 584 // Render Pages for printing. | 585 // Render Pages for printing. |
| 585 if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) | 586 if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) { |
| 587 LOG(ERROR) << "RenderPagesForPrint failed"; |
| 586 DidFinishPrinting(FAIL_PRINT); | 588 DidFinishPrinting(FAIL_PRINT); |
| 589 } |
| 587 } | 590 } |
| 588 | 591 |
| 589 bool PrintWebViewHelper::GetPrintFrame(WebKit::WebFrame** frame) { | 592 bool PrintWebViewHelper::GetPrintFrame(WebKit::WebFrame** frame) { |
| 590 DCHECK(frame); | 593 DCHECK(frame); |
| 591 DCHECK(render_view()->webview()); | 594 DCHECK(render_view()->webview()); |
| 592 if (!render_view()->webview()) | 595 if (!render_view()->webview()) |
| 593 return false; | 596 return false; |
| 594 | 597 |
| 595 // If the user has selected text in the currently focused frame we print | 598 // If the user has selected text in the currently focused frame we print |
| 596 // only that frame (this makes print selection work for multiple frames). | 599 // only that frame (this makes print selection work for multiple frames). |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 DCHECK(is_preview_); | 631 DCHECK(is_preview_); |
| 629 print_preview_context_.OnPrintPreview(); | 632 print_preview_context_.OnPrintPreview(); |
| 630 | 633 |
| 631 if (!InitPrintSettings(print_preview_context_.frame(), | 634 if (!InitPrintSettings(print_preview_context_.frame(), |
| 632 print_preview_context_.node())) { | 635 print_preview_context_.node())) { |
| 633 NOTREACHED(); | 636 NOTREACHED(); |
| 634 return; | 637 return; |
| 635 } | 638 } |
| 636 | 639 |
| 637 if (!UpdatePrintSettings(settings, true)) { | 640 if (!UpdatePrintSettings(settings, true)) { |
| 641 LOG(ERROR) << "UpdatePrintSettings failed"; |
| 638 DidFinishPrinting(FAIL_PREVIEW); | 642 DidFinishPrinting(FAIL_PREVIEW); |
| 639 return; | 643 return; |
| 640 } | 644 } |
| 641 | 645 |
| 642 if (!print_pages_params_->params.is_first_request && | 646 if (!print_pages_params_->params.is_first_request && |
| 643 old_print_pages_params_.get() && | 647 old_print_pages_params_.get() && |
| 644 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, | 648 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, |
| 645 *print_pages_params_)) { | 649 *print_pages_params_)) { |
| 646 PrintHostMsg_DidPreviewDocument_Params preview_params; | 650 PrintHostMsg_DidPreviewDocument_Params preview_params; |
| 647 preview_params.reuse_existing_data = true; | 651 preview_params.reuse_existing_data = true; |
| 648 preview_params.data_size = 0; | 652 preview_params.data_size = 0; |
| 649 preview_params.document_cookie = | 653 preview_params.document_cookie = |
| 650 print_pages_params_->params.document_cookie; | 654 print_pages_params_->params.document_cookie; |
| 651 preview_params.expected_pages_count = | 655 preview_params.expected_pages_count = |
| 652 print_preview_context_.total_page_count(); | 656 print_preview_context_.total_page_count(); |
| 653 preview_params.modifiable = print_preview_context_.IsModifiable(); | 657 preview_params.modifiable = print_preview_context_.IsModifiable(); |
| 654 preview_params.preview_request_id = | 658 preview_params.preview_request_id = |
| 655 print_pages_params_->params.preview_request_id; | 659 print_pages_params_->params.preview_request_id; |
| 656 | 660 |
| 657 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | 661 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| 658 return; | 662 return; |
| 659 } | 663 } |
| 660 // Always clear |old_print_pages_params_| before rendering the pages. | 664 // Always clear |old_print_pages_params_| before rendering the pages. |
| 661 old_print_pages_params_.reset(); | 665 old_print_pages_params_.reset(); |
| 662 | 666 |
| 663 // PDF printer device supports alpha blending. | 667 // PDF printer device supports alpha blending. |
| 664 print_pages_params_->params.supports_alpha_blend = true; | 668 print_pages_params_->params.supports_alpha_blend = true; |
| 665 if (CreatePreviewDocument()) | 669 if (CreatePreviewDocument()) { |
| 666 DidFinishPrinting(OK); | 670 DidFinishPrinting(OK); |
| 667 else | 671 } else { |
| 672 if (notify_browser_of_print_failure_) |
| 673 LOG(ERROR) << "CreatePreviewDocument failed"; |
| 668 DidFinishPrinting(FAIL_PREVIEW); | 674 DidFinishPrinting(FAIL_PREVIEW); |
| 675 } |
| 669 } | 676 } |
| 670 | 677 |
| 671 bool PrintWebViewHelper::CreatePreviewDocument() { | 678 bool PrintWebViewHelper::CreatePreviewDocument() { |
| 672 PrintMsg_Print_Params print_params = print_pages_params_->params; | 679 PrintMsg_Print_Params print_params = print_pages_params_->params; |
| 673 const std::vector<int>& pages = print_pages_params_->pages; | 680 const std::vector<int>& pages = print_pages_params_->pages; |
| 674 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) | 681 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) |
| 675 return false; | 682 return false; |
| 676 PrintHostMsg_DidGetPreviewPageCount_Params params; | 683 PrintHostMsg_DidGetPreviewPageCount_Params params; |
| 677 params.page_count = print_preview_context_.total_page_count(); | 684 params.page_count = print_preview_context_.total_page_count(); |
| 678 params.is_modifiable = print_preview_context_.IsModifiable(); | 685 params.is_modifiable = print_preview_context_.IsModifiable(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 preview_params.document_cookie = print_pages_params_->params.document_cookie; | 718 preview_params.document_cookie = print_pages_params_->params.document_cookie; |
| 712 preview_params.expected_pages_count = | 719 preview_params.expected_pages_count = |
| 713 print_preview_context_.total_page_count(); | 720 print_preview_context_.total_page_count(); |
| 714 preview_params.modifiable = print_preview_context_.IsModifiable(); | 721 preview_params.modifiable = print_preview_context_.IsModifiable(); |
| 715 preview_params.preview_request_id = | 722 preview_params.preview_request_id = |
| 716 print_pages_params_->params.preview_request_id; | 723 print_pages_params_->params.preview_request_id; |
| 717 | 724 |
| 718 // Ask the browser to create the shared memory for us. | 725 // Ask the browser to create the shared memory for us. |
| 719 if (!CopyMetafileDataToSharedMem(metafile, | 726 if (!CopyMetafileDataToSharedMem(metafile, |
| 720 &(preview_params.metafile_data_handle))) { | 727 &(preview_params.metafile_data_handle))) { |
| 728 LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; |
| 721 return false; | 729 return false; |
| 722 } | 730 } |
| 723 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | 731 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| 724 return true; | 732 return true; |
| 725 } | 733 } |
| 726 | 734 |
| 727 void PrintWebViewHelper::OnPrintingDone(bool success) { | 735 void PrintWebViewHelper::OnPrintingDone(bool success) { |
| 728 notify_browser_of_print_failure_ = false; | 736 notify_browser_of_print_failure_ = false; |
| 737 if (success == FAIL_PRINT) |
| 738 LOG(ERROR) << "Failure in OnPrintingDone"; |
| 729 DidFinishPrinting(success ? OK : FAIL_PRINT); | 739 DidFinishPrinting(success ? OK : FAIL_PRINT); |
| 730 } | 740 } |
| 731 | 741 |
| 732 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { | 742 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { |
| 733 const WebNode& context_menu_node = render_view()->context_menu_node(); | 743 const WebNode& context_menu_node = render_view()->context_menu_node(); |
| 734 if (context_menu_node.isNull()) { | 744 if (context_menu_node.isNull()) { |
| 735 NOTREACHED(); | 745 NOTREACHED(); |
| 736 return; | 746 return; |
| 737 } | 747 } |
| 738 | 748 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 } | 794 } |
| 785 | 795 |
| 786 // Ask the browser to show UI to retrieve the final print settings. | 796 // Ask the browser to show UI to retrieve the final print settings. |
| 787 if (!GetPrintSettingsFromUser(frame, expected_page_count, | 797 if (!GetPrintSettingsFromUser(frame, expected_page_count, |
| 788 use_browser_overlays)) { | 798 use_browser_overlays)) { |
| 789 DidFinishPrinting(OK); // Release resources and fail silently. | 799 DidFinishPrinting(OK); // Release resources and fail silently. |
| 790 return; | 800 return; |
| 791 } | 801 } |
| 792 | 802 |
| 793 // Render Pages for printing. | 803 // Render Pages for printing. |
| 794 if (!RenderPagesForPrint(frame, node, NULL)) | 804 if (!RenderPagesForPrint(frame, node, NULL)) { |
| 805 LOG(ERROR) << "RenderPagesForPrint failed"; |
| 795 DidFinishPrinting(FAIL_PRINT); | 806 DidFinishPrinting(FAIL_PRINT); |
| 807 } |
| 796 ResetScriptedPrintCount(); | 808 ResetScriptedPrintCount(); |
| 797 } | 809 } |
| 798 | 810 |
| 799 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { | 811 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
| 800 bool store_print_pages_params = true; | 812 bool store_print_pages_params = true; |
| 801 if (result == FAIL_PRINT) { | 813 if (result == FAIL_PRINT) { |
| 802 DisplayPrintJobError(); | 814 DisplayPrintJobError(); |
| 803 | 815 |
| 804 if (notify_browser_of_print_failure_) { | 816 if (notify_browser_of_print_failure_ && print_pages_params_.get()) { |
| 805 int cookie = print_pages_params_->params.document_cookie; | 817 int cookie = print_pages_params_->params.document_cookie; |
| 806 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); | 818 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); |
| 807 } | 819 } |
| 808 } else if (result == FAIL_PREVIEW) { | 820 } else if (result == FAIL_PREVIEW) { |
| 809 DCHECK(is_preview_); | 821 DCHECK(is_preview_); |
| 810 store_print_pages_params = false; | 822 store_print_pages_params = false; |
| 811 int cookie = print_pages_params_->params.document_cookie; | 823 int cookie = print_pages_params_->params.document_cookie; |
| 812 if (notify_browser_of_print_failure_) | 824 if (notify_browser_of_print_failure_) |
| 813 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); | 825 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
| 814 else | 826 else |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1253 NOTREACHED(); | 1265 NOTREACHED(); |
| 1254 return false; | 1266 return false; |
| 1255 } | 1267 } |
| 1256 | 1268 |
| 1257 PrintHostMsg_DidPreviewPage_Params preview_page_params; | 1269 PrintHostMsg_DidPreviewPage_Params preview_page_params; |
| 1258 // Get the size of the resulting metafile. | 1270 // Get the size of the resulting metafile. |
| 1259 uint32 buf_size = metafile->GetDataSize(); | 1271 uint32 buf_size = metafile->GetDataSize(); |
| 1260 DCHECK_GT(buf_size, 0u); | 1272 DCHECK_GT(buf_size, 0u); |
| 1261 if (!CopyMetafileDataToSharedMem( | 1273 if (!CopyMetafileDataToSharedMem( |
| 1262 metafile, &(preview_page_params.metafile_data_handle))) { | 1274 metafile, &(preview_page_params.metafile_data_handle))) { |
| 1275 LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; |
| 1263 return false; | 1276 return false; |
| 1264 } | 1277 } |
| 1265 preview_page_params.data_size = buf_size; | 1278 preview_page_params.data_size = buf_size; |
| 1266 preview_page_params.page_number = page_number; | 1279 preview_page_params.page_number = page_number; |
| 1267 preview_page_params.preview_request_id = | 1280 preview_page_params.preview_request_id = |
| 1268 print_pages_params_->params.preview_request_id; | 1281 print_pages_params_->params.preview_request_id; |
| 1269 | 1282 |
| 1270 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); | 1283 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); |
| 1271 return true; | 1284 return true; |
| 1272 } | 1285 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1305 | 1318 |
| 1306 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( | 1319 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( |
| 1307 PrintMsg_Print_Params* print_params, | 1320 PrintMsg_Print_Params* print_params, |
| 1308 const std::vector<int>& pages) { | 1321 const std::vector<int>& pages) { |
| 1309 DCHECK(IsReadyToRender()); | 1322 DCHECK(IsReadyToRender()); |
| 1310 state_ = RENDERING; | 1323 state_ = RENDERING; |
| 1311 | 1324 |
| 1312 print_params_.reset(new PrintMsg_Print_Params(*print_params)); | 1325 print_params_.reset(new PrintMsg_Print_Params(*print_params)); |
| 1313 | 1326 |
| 1314 metafile_.reset(new printing::PreviewMetafile); | 1327 metafile_.reset(new printing::PreviewMetafile); |
| 1315 if (!metafile_->Init()) | 1328 if (!metafile_->Init()) { |
| 1329 LOG(ERROR) << "PreviewMetafile Init failed"; |
| 1316 return false; | 1330 return false; |
| 1331 } |
| 1317 | 1332 |
| 1318 // Need to make sure old object gets destroyed first. | 1333 // Need to make sure old object gets destroyed first. |
| 1319 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), | 1334 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), |
| 1320 node())); | 1335 node())); |
| 1321 UpdatePrintableSizeInPrintParameters(frame_, node_.get(), | 1336 UpdatePrintableSizeInPrintParameters(frame_, node_.get(), |
| 1322 prep_frame_view_.get(), print_params); | 1337 prep_frame_view_.get(), print_params); |
| 1323 | 1338 |
| 1324 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); | 1339 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); |
| 1325 if (total_page_count_ == 0) | 1340 if (total_page_count_ == 0) { |
| 1341 LOG(ERROR) << "CreatePreviewDocument got 0 page count"; |
| 1326 return false; | 1342 return false; |
| 1343 } |
| 1327 | 1344 |
| 1328 current_page_index_ = 0; | 1345 current_page_index_ = 0; |
| 1329 if (pages.empty()) { | 1346 if (pages.empty()) { |
| 1330 actual_page_count_ = total_page_count_; | 1347 actual_page_count_ = total_page_count_; |
| 1331 for (int i = 0; i < actual_page_count_; ++i) | 1348 for (int i = 0; i < actual_page_count_; ++i) |
| 1332 pages_to_render_.push_back(i); | 1349 pages_to_render_.push_back(i); |
| 1333 } else { | 1350 } else { |
| 1334 actual_page_count_ = pages.size(); | 1351 actual_page_count_ = pages.size(); |
| 1335 for (int i = 0; i < actual_page_count_; ++i) { | 1352 for (int i = 0; i < actual_page_count_; ++i) { |
| 1336 int page_number = pages[i]; | 1353 int page_number = pages[i]; |
| 1337 if (page_number < printing::FIRST_PAGE_INDEX || | 1354 if (page_number < printing::FIRST_PAGE_INDEX || |
| 1338 page_number >= total_page_count_) { | 1355 page_number >= total_page_count_) { |
| 1356 LOG(ERROR) << "CreatePreviewDocument got invalid page count " |
| 1357 << page_number << " at index " << i; |
| 1339 return false; | 1358 return false; |
| 1340 } | 1359 } |
| 1341 pages_to_render_.push_back(page_number); | 1360 pages_to_render_.push_back(page_number); |
| 1342 } | 1361 } |
| 1343 } | 1362 } |
| 1344 | 1363 |
| 1345 document_render_time_ = base::TimeDelta(); | 1364 document_render_time_ = base::TimeDelta(); |
| 1346 begin_time_ = base::TimeTicks::Now(); | 1365 begin_time_ = base::TimeTicks::Now(); |
| 1347 | 1366 |
| 1348 return true; | 1367 return true; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 const gfx::Size& | 1456 const gfx::Size& |
| 1438 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { | 1457 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| 1439 return prep_frame_view_->GetPrintCanvasSize(); | 1458 return prep_frame_view_->GetPrintCanvasSize(); |
| 1440 } | 1459 } |
| 1441 | 1460 |
| 1442 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { | 1461 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| 1443 prep_frame_view_.reset(); | 1462 prep_frame_view_.reset(); |
| 1444 metafile_.reset(); | 1463 metafile_.reset(); |
| 1445 pages_to_render_.clear(); | 1464 pages_to_render_.clear(); |
| 1446 } | 1465 } |
| OLD | NEW |