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

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

Issue 7621087: Print Preview: Go from event driven print preview back to print preview with sync messages. The s... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: address comments Created 9 years, 4 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
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 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h"
10 #include "base/logging.h" 9 #include "base/logging.h"
11 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
12 #include "base/process_util.h"
13 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
14 #include "chrome/common/chrome_switches.h" 12 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/print_messages.h" 13 #include "chrome/common/print_messages.h"
16 #include "chrome/common/render_messages.h" 14 #include "chrome/common/render_messages.h"
17 #include "chrome/common/url_constants.h" 15 #include "chrome/common/url_constants.h"
18 #include "chrome/renderer/prerender/prerender_helper.h" 16 #include "chrome/renderer/prerender/prerender_helper.h"
19 #include "content/renderer/render_view.h" 17 #include "content/renderer/render_view.h"
20 #include "grit/generated_resources.h" 18 #include "grit/generated_resources.h"
21 #include "printing/metafile_impl.h" 19 #include "printing/metafile_impl.h"
22 #include "printing/print_job_constants.h" 20 #include "printing/print_job_constants.h"
23 #include "printing/units.h" 21 #include "printing/units.h"
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" 23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
32 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
33 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
34 32
35 #if defined(OS_POSIX) 33 #if defined(OS_POSIX)
34 #include "base/process_util.h"
36 #include "content/common/view_messages.h" 35 #include "content/common/view_messages.h"
37 #endif 36 #endif
38 37
39 #if defined(USE_SKIA) 38 #if defined(USE_SKIA)
40 #include "base/string_number_conversions.h" 39 #include "base/string_number_conversions.h"
41 #include "skia/ext/vector_canvas.h" 40 #include "skia/ext/vector_canvas.h"
42 #include "skia/ext/vector_platform_device_skia.h" 41 #include "skia/ext/vector_platform_device_skia.h"
43 #include "third_party/skia/include/core/SkTypeface.h" 42 #include "third_party/skia/include/core/SkTypeface.h"
44 #endif // defined(USE_SKIA) 43 #endif // defined(USE_SKIA)
45 44
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 363 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
365 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) 364 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog)
366 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) 365 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview)
367 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, 366 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu,
368 OnPrintNodeUnderContextMenu) 367 OnPrintNodeUnderContextMenu)
369 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 368 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
370 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) 369 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview)
371 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 370 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone)
372 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, 371 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount,
373 ResetScriptedPrintCount) 372 ResetScriptedPrintCount)
374 IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, OnContinuePreview)
375 IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, OnAbortPreview)
376 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, 373 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled,
377 DisplayPrintJobError) 374 DisplayPrintJobError)
378 IPC_MESSAGE_UNHANDLED(handled = false) 375 IPC_MESSAGE_UNHANDLED(handled = false)
379 IPC_END_MESSAGE_MAP() 376 IPC_END_MESSAGE_MAP()
380 return handled; 377 return handled;
381 } 378 }
382 379
383 void PrintWebViewHelper::OnPrintForPrintPreview( 380 void PrintWebViewHelper::OnPrintForPrintPreview(
384 const DictionaryValue& job_settings) { 381 const DictionaryValue& job_settings) {
385 DCHECK(is_preview_); 382 DCHECK(is_preview_);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 print_pages_params_->params.preview_request_id; 485 print_pages_params_->params.preview_request_id;
489 486
490 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); 487 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
491 return; 488 return;
492 } 489 }
493 // Always clear |old_print_pages_params_| before rendering the pages. 490 // Always clear |old_print_pages_params_| before rendering the pages.
494 old_print_pages_params_.reset(); 491 old_print_pages_params_.reset();
495 492
496 // PDF printer device supports alpha blending. 493 // PDF printer device supports alpha blending.
497 print_pages_params_->params.supports_alpha_blend = true; 494 print_pages_params_->params.supports_alpha_blend = true;
498 if (!CreatePreviewDocument()) 495 if (CreatePreviewDocument())
496 DidFinishPrinting(OK);
497 else
499 DidFinishPrinting(FAIL_PREVIEW); 498 DidFinishPrinting(FAIL_PREVIEW);
500 } 499 }
501 500
502 bool PrintWebViewHelper::CreatePreviewDocument() { 501 bool PrintWebViewHelper::CreatePreviewDocument() {
503 PrintMsg_Print_Params print_params = print_pages_params_->params; 502 PrintMsg_Print_Params print_params = print_pages_params_->params;
504 const std::vector<int>& pages = print_pages_params_->pages; 503 const std::vector<int>& pages = print_pages_params_->pages;
505 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) 504 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages))
506 return false; 505 return false;
507 PrintHostMsg_DidGetPreviewPageCount_Params params; 506 PrintHostMsg_DidGetPreviewPageCount_Params params;
508 params.page_count = print_preview_context_.total_page_count(); 507 params.page_count = print_preview_context_.total_page_count();
509 params.is_modifiable = print_preview_context_.IsModifiable(); 508 params.is_modifiable = print_preview_context_.IsModifiable();
510 params.document_cookie = print_pages_params_->params.document_cookie; 509 params.document_cookie = print_pages_params_->params.document_cookie;
511 params.preview_request_id = print_pages_params_->params.preview_request_id; 510 params.preview_request_id = print_pages_params_->params.preview_request_id;
512 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 511 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params));
513 PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); 512 if (!CheckForCancel())
514 return true; 513 return false;
515 }
516 514
517 void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) {
518 // Spurious message. We already finished/cancelled/aborted the print preview.
519 if (!print_preview_context_.IsBusy())
520 return;
521 int page_number; 515 int page_number;
522 #if defined(USE_SKIA) 516 while ((page_number = print_preview_context_.GetNextPageNumber()) >= 0) {
523 if (requested_preview_page_index >= printing::FIRST_PAGE_INDEX) { 517 if (!RenderPreviewPage(page_number))
524 page_number = requested_preview_page_index; 518 return false;
525 } else 519 if (!CheckForCancel())
526 #endif 520 return false;
527 { 521 };
528 page_number = print_preview_context_.GetNextPageNumber();
529 }
530
531 if (page_number >= printing::FIRST_PAGE_INDEX) {
532 // Continue generating the print preview.
533 RenderPreviewPage(page_number);
534 return;
535 }
536 522
537 // Finished generating preview. Finalize the document. 523 // Finished generating preview. Finalize the document.
538 if (FinalizePreviewDocument()) { 524 if (!FinalizePreviewDocument())
539 print_preview_context_.Finished(); 525 return false;
540 DidFinishPrinting(OK); 526 print_preview_context_.Finished();
541 } else { 527 return true;
542 DidFinishPrinting(FAIL_PREVIEW);
543 }
544 }
545
546 void PrintWebViewHelper::OnAbortPreview() {
547 DidFinishPrinting(ABORT_PREVIEW);
548 return;
549 } 528 }
550 529
551 bool PrintWebViewHelper::FinalizePreviewDocument() { 530 bool PrintWebViewHelper::FinalizePreviewDocument() {
552 print_preview_context_.FinalizePreviewDocument(); 531 print_preview_context_.FinalizePreviewDocument();
553 532
554 // Get the size of the resulting metafile. 533 // Get the size of the resulting metafile.
555 printing::PreviewMetafile* metafile = print_preview_context_.metafile(); 534 printing::PreviewMetafile* metafile = print_preview_context_.metafile();
556 uint32 buf_size = metafile->GetDataSize(); 535 uint32 buf_size = metafile->GetDataSize();
557 DCHECK_GT(buf_size, 0u); 536 DCHECK_GT(buf_size, 0u);
558 537
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 DisplayPrintJobError(); 632 DisplayPrintJobError();
654 633
655 if (notify_browser_of_print_failure_) { 634 if (notify_browser_of_print_failure_) {
656 int cookie = print_pages_params_->params.document_cookie; 635 int cookie = print_pages_params_->params.document_cookie;
657 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 636 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
658 } 637 }
659 } else if (result == FAIL_PREVIEW) { 638 } else if (result == FAIL_PREVIEW) {
660 DCHECK(is_preview_); 639 DCHECK(is_preview_);
661 store_print_pages_params = false; 640 store_print_pages_params = false;
662 int cookie = print_pages_params_->params.document_cookie; 641 int cookie = print_pages_params_->params.document_cookie;
663 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 642 if (notify_browser_of_print_failure_)
643 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
644 else
645 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie));
664 print_preview_context_.Failed(); 646 print_preview_context_.Failed();
665 } else if (result == ABORT_PREVIEW) {
666 DCHECK(is_preview_);
667 store_print_pages_params = false;
668 print_preview_context_.Abort();
669 } 647 }
670 648
671 if (print_web_view_) { 649 if (print_web_view_) {
672 print_web_view_->close(); 650 print_web_view_->close();
673 print_web_view_ = NULL; 651 print_web_view_ = NULL;
674 } 652 }
675 653
676 if (store_print_pages_params) { 654 if (store_print_pages_params) {
677 old_print_pages_params_.reset(print_pages_params_.release()); 655 old_print_pages_params_.reset(print_pages_params_.release());
678 } else { 656 } else {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 DCHECK(!prepare->get()); 874 DCHECK(!prepare->get());
897 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, 875 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params,
898 frame, node)); 876 frame, node));
899 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(), 877 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(),
900 &print_pages_params_->params); 878 &print_pages_params_->params);
901 Send(new PrintHostMsg_DidGetDocumentCookie( 879 Send(new PrintHostMsg_DidGetDocumentCookie(
902 routing_id(), print_pages_params_->params.document_cookie)); 880 routing_id(), print_pages_params_->params.document_cookie));
903 return true; 881 return true;
904 } 882 }
905 883
906 bool PrintWebViewHelper::UpdatePrintSettingsRequestId(
907 const DictionaryValue& job_settings,
908 PrintMsg_Print_Params* params) {
909 if (!job_settings.GetInteger(printing::kPreviewRequestID,
910 &(params->preview_request_id))) {
911 NOTREACHED();
912 return false;
913 }
914 return true;
915 }
916
917 bool PrintWebViewHelper::UpdatePrintSettings( 884 bool PrintWebViewHelper::UpdatePrintSettings(
918 const DictionaryValue& job_settings) { 885 const DictionaryValue& job_settings) {
919 PrintMsg_PrintPages_Params settings; 886 PrintMsg_PrintPages_Params settings;
920 887
921 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), 888 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(),
922 print_pages_params_->params.document_cookie, job_settings, &settings)); 889 print_pages_params_->params.document_cookie, job_settings, &settings));
923 890
924 if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) 891 if (settings.params.dpi < kMinDpi || !settings.params.document_cookie)
925 return false; 892 return false;
926 893
927 if (!UpdatePrintSettingsRequestId(job_settings, &(settings.params))) 894 if (!job_settings.GetString(printing::kPreviewUIAddr,
928 return false; 895 &(settings.params.preview_ui_addr)) ||
929 896 !job_settings.GetInteger(printing::kPreviewRequestID,
930 if (!job_settings.GetBoolean(printing::kIsFirstRequest, 897 &(settings.params.preview_request_id)) ||
898 !job_settings.GetBoolean(printing::kIsFirstRequest,
931 &(settings.params.is_first_request))) { 899 &(settings.params.is_first_request))) {
932 NOTREACHED(); 900 NOTREACHED();
901 return false;
933 } 902 }
934 903
935 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 904 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
936 905
937 if (print_pages_params_->params.display_header_footer) { 906 if (print_pages_params_->params.display_header_footer) {
938 header_footer_info_.reset(new DictionaryValue()); 907 header_footer_info_.reset(new DictionaryValue());
939 header_footer_info_->SetString(printing::kSettingHeaderFooterDate, 908 header_footer_info_->SetString(printing::kSettingHeaderFooterDate,
940 print_pages_params_->params.date); 909 print_pages_params_->params.date);
941 header_footer_info_->SetString(printing::kSettingHeaderFooterURL, 910 header_footer_info_->SetString(printing::kSettingHeaderFooterURL,
942 print_pages_params_->params.url); 911 print_pages_params_->params.url);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 min_wait_seconds = std::min( 1001 min_wait_seconds = std::min(
1033 kMinSecondsToIgnoreJavascriptInitiatedPrint << 1002 kMinSecondsToIgnoreJavascriptInitiatedPrint <<
1034 (user_cancelled_scripted_print_count_ - 3), 1003 (user_cancelled_scripted_print_count_ - 3),
1035 kMaxSecondsToIgnoreJavascriptInitiatedPrint); 1004 kMaxSecondsToIgnoreJavascriptInitiatedPrint);
1036 } 1005 }
1037 if (diff.InSeconds() < min_wait_seconds) { 1006 if (diff.InSeconds() < min_wait_seconds) {
1038 too_frequent = true; 1007 too_frequent = true;
1039 } 1008 }
1040 } 1009 }
1041 1010
1042 if (!too_frequent && print_preview_context_.IsBusy())
1043 too_frequent = true;
1044
1045 if (!too_frequent) 1011 if (!too_frequent)
1046 return false; 1012 return false;
1047 1013
1048 WebString message(WebString::fromUTF8( 1014 WebString message(WebString::fromUTF8(
1049 "Ignoring too frequent calls to print().")); 1015 "Ignoring too frequent calls to print()."));
1050 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning, 1016 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning,
1051 message)); 1017 message));
1052 return true; 1018 return true;
1053 } 1019 }
1054 1020
(...skipping 15 matching lines...) Expand all
1070 render_view()->runModalAlertDialog( 1036 render_view()->runModalAlertDialog(
1071 web_view->mainFrame(), 1037 web_view->mainFrame(),
1072 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); 1038 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT));
1073 } 1039 }
1074 1040
1075 void PrintWebViewHelper::RequestPrintPreview() { 1041 void PrintWebViewHelper::RequestPrintPreview() {
1076 old_print_pages_params_.reset(); 1042 old_print_pages_params_.reset();
1077 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); 1043 Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
1078 } 1044 }
1079 1045
1080 void PrintWebViewHelper::PreviewPageRendered(int page_number, 1046 bool PrintWebViewHelper::CheckForCancel() {
1047 bool cancel = false;
1048 Send(new PrintHostMsg_CheckForCancel(
1049 routing_id(),
1050 print_pages_params_->params.preview_ui_addr,
1051 print_pages_params_->params.preview_request_id,
1052 &cancel));
1053 if (cancel) {
1054 notify_browser_of_print_failure_ = false;
1055 return false;
1056 }
1057 return true;
1058 }
1059
1060 bool PrintWebViewHelper::PreviewPageRendered(int page_number,
1081 printing::Metafile* metafile) { 1061 printing::Metafile* metafile) {
1082 if ((page_number == printing::INVALID_PAGE_INDEX && metafile) || 1062 if (page_number < printing::FIRST_PAGE_INDEX) {
1083 (page_number >= printing::FIRST_PAGE_INDEX && !metafile &&
1084 print_preview_context_.IsModifiable())) {
1085 NOTREACHED(); 1063 NOTREACHED();
1086 DidFinishPrinting(FAIL_PREVIEW); 1064 return false;
1087 return; 1065 }
1066
1067 // For non-modifiable files, |metafile| should be NULL, so do not bother
1068 // sending a message.
1069 if (!print_preview_context_.IsModifiable()) {
1070 DCHECK(!metafile);
1071 return true;
1072 }
1073
1074 if (!metafile) {
1075 NOTREACHED();
1076 return false;
1088 } 1077 }
1089 1078
1090 uint32 buf_size = 0; 1079 uint32 buf_size = 0;
1091 PrintHostMsg_DidPreviewPage_Params preview_page_params; 1080 PrintHostMsg_DidPreviewPage_Params preview_page_params;
1092 // Get the size of the resulting metafile. 1081 // Get the size of the resulting metafile.
1093 if (metafile) { 1082 if (metafile) {
1094 buf_size = metafile->GetDataSize(); 1083 buf_size = metafile->GetDataSize();
1095 DCHECK_GT(buf_size, 0u); 1084 DCHECK_GT(buf_size, 0u);
1096 if (!CopyMetafileDataToSharedMem( 1085 if (!CopyMetafileDataToSharedMem(
1097 metafile, &(preview_page_params.metafile_data_handle))) { 1086 metafile, &(preview_page_params.metafile_data_handle))) {
1098 DidFinishPrinting(FAIL_PREVIEW); 1087 return false;
1099 return;
1100 } 1088 }
1101 } 1089 }
1102 preview_page_params.data_size = buf_size; 1090 preview_page_params.data_size = buf_size;
1103 preview_page_params.page_number = page_number; 1091 preview_page_params.page_number = page_number;
1104 preview_page_params.preview_request_id = 1092 preview_page_params.preview_request_id =
1105 print_pages_params_->params.preview_request_id; 1093 print_pages_params_->params.preview_request_id;
1094
1106 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1095 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1096 return true;
1107 } 1097 }
1108 1098
1109 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1099 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1110 : frame_(NULL), 1100 : frame_(NULL),
1111 total_page_count_(0), 1101 total_page_count_(0),
1112 actual_page_count_(0), 1102 actual_page_count_(0),
1113 current_page_number_(0), 1103 current_page_index_(0),
1114 state_(UNINITIALIZED) { 1104 state_(UNINITIALIZED) {
1115 } 1105 }
1116 1106
1117 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 1107 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
1118 } 1108 }
1119 1109
1120 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 1110 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
1121 WebKit::WebFrame* web_frame) { 1111 WebKit::WebFrame* web_frame) {
1122 DCHECK(web_frame); 1112 DCHECK(web_frame);
1123 if (IsReadyToRender())
1124 return;
1125 state_ = INITIALIZED; 1113 state_ = INITIALIZED;
1126 frame_ = web_frame; 1114 frame_ = web_frame;
1127 node_.reset(); 1115 node_.reset();
1128 } 1116 }
1129 1117
1130 void PrintWebViewHelper::PrintPreviewContext::InitWithNode( 1118 void PrintWebViewHelper::PrintPreviewContext::InitWithNode(
1131 const WebKit::WebNode& web_node) { 1119 const WebKit::WebNode& web_node) {
1132 DCHECK(!web_node.isNull()); 1120 DCHECK(!web_node.isNull());
1133 if (IsReadyToRender())
1134 return;
1135 state_ = INITIALIZED; 1121 state_ = INITIALIZED;
1136 frame_ = web_node.document().frame(); 1122 frame_ = web_node.document().frame();
1137 node_.reset(new WebNode(web_node)); 1123 node_.reset(new WebNode(web_node));
1138 } 1124 }
1139 1125
1140 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { 1126 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
1141 DCHECK(IsReadyToRender()); 1127 DCHECK(IsReadyToRender());
1142 ClearContext(); 1128 ClearContext();
1143 } 1129 }
1144 1130
(...skipping 12 matching lines...) Expand all
1157 // Need to make sure old object gets destroyed first. 1143 // Need to make sure old object gets destroyed first.
1158 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), 1144 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(),
1159 node())); 1145 node()));
1160 UpdatePrintableSizeInPrintParameters(frame_, node_.get(), 1146 UpdatePrintableSizeInPrintParameters(frame_, node_.get(),
1161 prep_frame_view_.get(), print_params); 1147 prep_frame_view_.get(), print_params);
1162 1148
1163 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1149 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
1164 if (total_page_count_ == 0) 1150 if (total_page_count_ == 0)
1165 return false; 1151 return false;
1166 1152
1167 current_page_number_ = 0; 1153 current_page_index_ = 0;
1168 if (pages.empty()) { 1154 if (pages.empty()) {
1169 actual_page_count_ = total_page_count_; 1155 actual_page_count_ = total_page_count_;
1170 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, 1156 for (int i = 0; i < actual_page_count_; ++i)
1171 std::make_pair(false, -1)); 1157 pages_to_render_.push_back(i);
1172 } else { 1158 } else {
1173 actual_page_count_ = pages.size(); 1159 actual_page_count_ = pages.size();
1174 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_,
1175 std::make_pair(true, -1));
1176 for (int i = 0; i < actual_page_count_; ++i) { 1160 for (int i = 0; i < actual_page_count_; ++i) {
1177 int page_number = pages[i]; 1161 int page_number = pages[i];
1178 if (page_number < printing::FIRST_PAGE_INDEX || 1162 if (page_number < printing::FIRST_PAGE_INDEX ||
1179 page_number >= total_page_count_) { 1163 page_number >= total_page_count_) {
1180 return false; 1164 return false;
1181 } 1165 }
1182 rendered_pages_[page_number].first = false; 1166 pages_to_render_.push_back(page_number);
1183 rendered_pages_[page_number].second = i;
1184 } 1167 }
1185 } 1168 }
1186 1169
1187 document_render_time_ = base::TimeDelta(); 1170 document_render_time_ = base::TimeDelta();
1188 begin_time_ = base::TimeTicks::Now(); 1171 begin_time_ = base::TimeTicks::Now();
1189 1172
1190 return true; 1173 return true;
1191 } 1174 }
1192 1175
1193 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( 1176 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
(...skipping 26 matching lines...) Expand all
1220 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", 1203 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
1221 total_time / actual_page_count_); 1204 total_time / actual_page_count_);
1222 } 1205 }
1223 1206
1224 void PrintWebViewHelper::PrintPreviewContext::Finished() { 1207 void PrintWebViewHelper::PrintPreviewContext::Finished() {
1225 DCHECK_EQ(DONE, state_); 1208 DCHECK_EQ(DONE, state_);
1226 ClearContext(); 1209 ClearContext();
1227 } 1210 }
1228 1211
1229 void PrintWebViewHelper::PrintPreviewContext::Failed() { 1212 void PrintWebViewHelper::PrintPreviewContext::Failed() {
1230 DCHECK(IsBusy()); 1213 DCHECK(state_ == INITIALIZED || state_ == RENDERING);
1231 state_ = INITIALIZED; 1214 state_ = INITIALIZED;
1232 ClearContext(); 1215 ClearContext();
1233 } 1216 }
1234 1217
1235 void PrintWebViewHelper::PrintPreviewContext::Abort() {
1236 state_ = UNINITIALIZED;
1237 ClearContext();
1238 frame_ = NULL;
1239 node_.reset();
1240 }
1241
1242 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1218 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1243 DCHECK_EQ(RENDERING, state_); 1219 DCHECK_EQ(RENDERING, state_);
1244 for (int i = 0; i < total_page_count_; i++) { 1220 if (current_page_index_ >= actual_page_count_)
1245 if (!rendered_pages_[current_page_number_].first) 1221 return -1;
1246 break; 1222 return pages_to_render_[current_page_index_++];
1247 current_page_number_ = (current_page_number_ + 1) % total_page_count_;
1248 }
1249 if (rendered_pages_[current_page_number_].first)
1250 return printing::INVALID_PAGE_INDEX;
1251 rendered_pages_[current_page_number_].first = true;
1252 return current_page_number_;
1253 } 1223 }
1254 1224
1255 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { 1225 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1256 return state_ != UNINITIALIZED; 1226 return state_ != UNINITIALIZED;
1257 } 1227 }
1258 1228
1259 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
1260 return state_ == INITIALIZED || state_ == RENDERING;
1261 }
1262
1263 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { 1229 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1264 // TODO(vandebo) I think this should only return false if the content is a 1230 // TODO(vandebo) I think this should only return false if the content is a
1265 // PDF, just because we are printing a particular node does not mean it's 1231 // PDF, just because we are printing a particular node does not mean it's
1266 // a PDF (right?), we should check the mime type of the node. 1232 // a PDF (right?), we should check the mime type of the node.
1267 if (node()) 1233 if (node())
1268 return false; 1234 return false;
1269 std::string mime(frame()->dataSource()->response().mimeType().utf8()); 1235 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1270 return mime != "application/pdf"; 1236 return mime != "application/pdf";
1271 } 1237 }
1272 1238
1273 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { 1239 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1274 return frame_; 1240 return frame_;
1275 } 1241 }
1276 1242
1277 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { 1243 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
1278 return node_.get(); 1244 return node_.get();
1279 } 1245 }
1280 1246
1281 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 1247 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1248 DCHECK(IsReadyToRender());
1282 return total_page_count_; 1249 return total_page_count_;
1283 } 1250 }
1284 1251
1285 printing::PreviewMetafile* 1252 printing::PreviewMetafile*
1286 PrintWebViewHelper::PrintPreviewContext::metafile() const { 1253 PrintWebViewHelper::PrintPreviewContext::metafile() const {
1287 return metafile_.get(); 1254 return metafile_.get();
1288 } 1255 }
1289 1256
1290 const PrintMsg_Print_Params& 1257 const PrintMsg_Print_Params&
1291 PrintWebViewHelper::PrintPreviewContext::print_params() const { 1258 PrintWebViewHelper::PrintPreviewContext::print_params() const {
1292 return *print_params_; 1259 return *print_params_;
1293 } 1260 }
1294 1261
1295 const gfx::Size& 1262 const gfx::Size&
1296 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1263 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1297 return prep_frame_view_->GetPrintCanvasSize(); 1264 return prep_frame_view_->GetPrintCanvasSize();
1298 } 1265 }
1299 1266
1300 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1267 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1301 prep_frame_view_.reset(); 1268 prep_frame_view_.reset();
1302 metafile_.reset(); 1269 metafile_.reset();
1303 rendered_pages_.clear(); 1270 pages_to_render_.clear();
1304 } 1271 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698