Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

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

Issue 7765010: Print Preview: Prevent a crash and add error logging. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/renderer/print_web_view_helper_mac.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | chrome/renderer/print_web_view_helper_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698