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

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

Issue 7647010: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix win browser_test failures. 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" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 if (WebFrame* web_frame = web_view_->mainFrame()) 170 if (WebFrame* web_frame = web_view_->mainFrame())
171 web_frame->setScrollOffset(prev_scroll_offset_); 171 web_frame->setScrollOffset(prev_scroll_offset_);
172 } 172 }
173 } 173 }
174 174
175 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) 175 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view)
176 : RenderViewObserver(render_view), 176 : RenderViewObserver(render_view),
177 RenderViewObserverTracker<PrintWebViewHelper>(render_view), 177 RenderViewObserverTracker<PrintWebViewHelper>(render_view),
178 print_web_view_(NULL), 178 print_web_view_(NULL),
179 is_preview_(switches::IsPrintPreviewEnabled()), 179 is_preview_(switches::IsPrintPreviewEnabled()),
180 is_print_ready_metafile_sent_(false),
180 user_cancelled_scripted_print_count_(0), 181 user_cancelled_scripted_print_count_(0),
181 notify_browser_of_print_failure_(true) { 182 notify_browser_of_print_failure_(true) {
182 } 183 }
183 184
184 PrintWebViewHelper::~PrintWebViewHelper() {} 185 PrintWebViewHelper::~PrintWebViewHelper() {}
185 186
186 // Prints |frame| which called window.print(). 187 // Prints |frame| which called window.print().
187 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { 188 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
188 DCHECK(frame); 189 DCHECK(frame);
189 190
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 307
307 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { 308 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
308 DCHECK(is_preview_); 309 DCHECK(is_preview_);
309 print_preview_context_.OnPrintPreview(); 310 print_preview_context_.OnPrintPreview();
310 311
311 if (!InitPrintSettings(print_preview_context_.frame(), 312 if (!InitPrintSettings(print_preview_context_.frame(),
312 print_preview_context_.node())) { 313 print_preview_context_.node())) {
313 NOTREACHED(); 314 NOTREACHED();
314 return; 315 return;
315 } 316 }
316
317 if (!UpdatePrintSettings(settings)) { 317 if (!UpdatePrintSettings(settings)) {
318 DidFinishPrinting(FAIL_PREVIEW); 318 DidFinishPrinting(FAIL_PREVIEW);
319 return; 319 return;
320 } 320 }
321 321
322 if (!print_pages_params_->params.is_first_request && 322 if (!print_pages_params_->params.is_first_request &&
323 old_print_pages_params_.get() && 323 old_print_pages_params_.get() &&
324 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, 324 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_,
325 *print_pages_params_)) { 325 *print_pages_params_)) {
326 PrintHostMsg_DidPreviewDocument_Params preview_params; 326 PrintHostMsg_DidPreviewDocument_Params preview_params;
327 preview_params.reuse_existing_data = true; 327 preview_params.reuse_existing_data = true;
328 preview_params.data_size = 0; 328 preview_params.data_size = 0;
329 preview_params.document_cookie = 329 preview_params.document_cookie =
330 print_pages_params_->params.document_cookie; 330 print_pages_params_->params.document_cookie;
331 preview_params.expected_pages_count = 331 preview_params.expected_pages_count =
332 print_preview_context_.total_page_count(); 332 print_preview_context_.total_page_count();
333 preview_params.modifiable = print_preview_context_.IsModifiable(); 333 preview_params.modifiable = print_preview_context_.IsModifiable();
334 preview_params.preview_request_id = 334 preview_params.preview_request_id =
335 print_pages_params_->params.preview_request_id; 335 print_pages_params_->params.preview_request_id;
336 336
337 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); 337 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(),
338 preview_params));
338 return; 339 return;
339 } 340 }
340 // Always clear |old_print_pages_params_| before rendering the pages. 341 // Always clear |old_print_pages_params_| before rendering the pages.
341 old_print_pages_params_.reset(); 342 old_print_pages_params_.reset();
343 is_print_ready_metafile_sent_ = false;
342 344
343 // PDF printer device supports alpha blending. 345 // PDF printer device supports alpha blending.
344 print_pages_params_->params.supports_alpha_blend = true; 346 print_pages_params_->params.supports_alpha_blend = true;
347
348 bool generate_draft_pages;
349 if (!settings.GetBoolean(printing::kSettingGenerateDraftData,
350 &generate_draft_pages)) {
351 NOTREACHED();
352 }
353 print_preview_context_.set_generate_draft_pages(generate_draft_pages);
354
345 if (!CreatePreviewDocument()) 355 if (!CreatePreviewDocument())
346 DidFinishPrinting(FAIL_PREVIEW); 356 DidFinishPrinting(FAIL_PREVIEW);
347 } 357 }
348 358
349 bool PrintWebViewHelper::CreatePreviewDocument() { 359 bool PrintWebViewHelper::CreatePreviewDocument() {
350 PrintMsg_Print_Params print_params = print_pages_params_->params; 360 PrintMsg_Print_Params print_params = print_pages_params_->params;
351 const std::vector<int>& pages = print_pages_params_->pages; 361 const std::vector<int>& pages = print_pages_params_->pages;
352 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) 362 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages))
353 return false; 363 return false;
354 PrintHostMsg_DidGetPreviewPageCount_Params params; 364 PrintHostMsg_DidGetPreviewPageCount_Params params;
355 params.page_count = print_preview_context_.total_page_count(); 365 params.page_count = print_preview_context_.total_page_count();
356 params.is_modifiable = print_preview_context_.IsModifiable(); 366 params.is_modifiable = print_preview_context_.IsModifiable();
357 params.document_cookie = print_pages_params_->params.document_cookie; 367 params.document_cookie = print_pages_params_->params.document_cookie;
358 params.preview_request_id = print_pages_params_->params.preview_request_id; 368 params.preview_request_id = print_pages_params_->params.preview_request_id;
369 params.clear_preview_data = print_preview_context_.generate_draft_pages();
359 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 370 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params));
371
360 PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); 372 PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL);
361 return true; 373 return true;
362 } 374 }
363 375
364 void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) { 376 void PrintWebViewHelper::OnContinuePreview() {
365 // Spurious message. We already finished/cancelled/aborted the print preview. 377 // Spurious message. We already finished/cancelled/aborted the print preview.
366 if (!print_preview_context_.IsBusy()) 378 if (!print_preview_context_.IsBusy())
367 return; 379 return;
368 int page_number; 380 int page_number = print_preview_context_.GetNextPageNumber();
369 #if defined(USE_SKIA)
370 if (requested_preview_page_index >= printing::FIRST_PAGE_INDEX) {
371 page_number = requested_preview_page_index;
372 } else
373 #endif
374 {
375 page_number = print_preview_context_.GetNextPageNumber();
376 }
377 381
378 if (page_number >= printing::FIRST_PAGE_INDEX) { 382 if (page_number >= printing::FIRST_PAGE_INDEX) {
379 // Continue generating the print preview. 383 // Continue generating the print preview.
380 RenderPreviewPage(page_number); 384 RenderPreviewPage(page_number);
381 return;
382 } 385 }
383 386
384 // Finished generating preview. Finalize the document. 387 if (print_preview_context_.IsFinalPageRendered())
385 if (FinalizePreviewDocument()) { 388 print_preview_context_.AllPagesRendered();
389
390 if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) {
391 // Finished generating preview. Finalize the document.
392 if (!FinalizePrintReadyDocument())
393 DidFinishPrinting(FAIL_PREVIEW);
394 }
395
396 if (page_number == printing::INVALID_PAGE_INDEX) {
386 print_preview_context_.Finished(); 397 print_preview_context_.Finished();
387 DidFinishPrinting(OK); 398 DidFinishPrinting(OK);
388 } else {
389 DidFinishPrinting(FAIL_PREVIEW);
390 } 399 }
391 } 400 }
392 401
393 void PrintWebViewHelper::OnAbortPreview() { 402 void PrintWebViewHelper::OnAbortPreview() {
394 DidFinishPrinting(ABORT_PREVIEW); 403 DidFinishPrinting(ABORT_PREVIEW);
395 return; 404 return;
396 } 405 }
397 406
398 bool PrintWebViewHelper::FinalizePreviewDocument() { 407 bool PrintWebViewHelper::FinalizePrintReadyDocument() {
399 print_preview_context_.FinalizePreviewDocument(); 408 DCHECK(!is_print_ready_metafile_sent_);
409 print_preview_context_.FinalizePrintReadyDocument();
400 410
401 // Get the size of the resulting metafile. 411 // Get the size of the resulting metafile.
402 printing::PreviewMetafile* metafile = print_preview_context_.metafile(); 412 printing::PreviewMetafile* metafile = print_preview_context_.metafile();
403 uint32 buf_size = metafile->GetDataSize(); 413 uint32 buf_size = metafile->GetDataSize();
404 DCHECK_GT(buf_size, 0u); 414 DCHECK_GT(buf_size, 0u);
405 415
406 PrintHostMsg_DidPreviewDocument_Params preview_params; 416 PrintHostMsg_DidPreviewDocument_Params preview_params;
407 preview_params.reuse_existing_data = false; 417 preview_params.reuse_existing_data = false;
408 preview_params.data_size = buf_size; 418 preview_params.data_size = buf_size;
409 preview_params.document_cookie = print_pages_params_->params.document_cookie; 419 preview_params.document_cookie = print_pages_params_->params.document_cookie;
410 preview_params.expected_pages_count = 420 preview_params.expected_pages_count =
411 print_preview_context_.total_page_count(); 421 print_preview_context_.total_page_count();
412 preview_params.modifiable = print_preview_context_.IsModifiable(); 422 preview_params.modifiable = print_preview_context_.IsModifiable();
413 preview_params.preview_request_id = 423 preview_params.preview_request_id =
414 print_pages_params_->params.preview_request_id; 424 print_pages_params_->params.preview_request_id;
415 425
416 // Ask the browser to create the shared memory for us. 426 // Ask the browser to create the shared memory for us.
417 if (!CopyMetafileDataToSharedMem(metafile, 427 if (!CopyMetafileDataToSharedMem(metafile,
418 &(preview_params.metafile_data_handle))) { 428 &(preview_params.metafile_data_handle))) {
419 return false; 429 return false;
420 } 430 }
421 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); 431 is_print_ready_metafile_sent_ = true;
432
433 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params));
422 return true; 434 return true;
423 } 435 }
424 436
425 void PrintWebViewHelper::OnPrintingDone(bool success) { 437 void PrintWebViewHelper::OnPrintingDone(bool success) {
426 notify_browser_of_print_failure_ = false; 438 notify_browser_of_print_failure_ = false;
427 DidFinishPrinting(success ? OK : FAIL_PRINT); 439 DidFinishPrinting(success ? OK : FAIL_PRINT);
428 } 440 }
429 441
430 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { 442 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
431 const WebNode& context_menu_node = render_view()->context_menu_node(); 443 const WebNode& context_menu_node = render_view()->context_menu_node();
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 922
911 void PrintWebViewHelper::RequestPrintPreview() { 923 void PrintWebViewHelper::RequestPrintPreview() {
912 old_print_pages_params_.reset(); 924 old_print_pages_params_.reset();
913 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); 925 Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
914 } 926 }
915 927
916 void PrintWebViewHelper::PreviewPageRendered(int page_number, 928 void PrintWebViewHelper::PreviewPageRendered(int page_number,
917 printing::Metafile* metafile) { 929 printing::Metafile* metafile) {
918 if ((page_number == printing::INVALID_PAGE_INDEX && metafile) || 930 if ((page_number == printing::INVALID_PAGE_INDEX && metafile) ||
919 (page_number >= printing::FIRST_PAGE_INDEX && !metafile && 931 (page_number >= printing::FIRST_PAGE_INDEX && !metafile &&
920 print_preview_context_.IsModifiable())) { 932 print_preview_context_.IsModifiable() &&
933 print_preview_context_.generate_draft_pages())) {
921 NOTREACHED(); 934 NOTREACHED();
922 DidFinishPrinting(FAIL_PREVIEW); 935 DidFinishPrinting(FAIL_PREVIEW);
923 return; 936 return;
924 } 937 }
925 938
926 uint32 buf_size = 0; 939 uint32 buf_size = 0;
927 PrintHostMsg_DidPreviewPage_Params preview_page_params; 940 PrintHostMsg_DidPreviewPage_Params preview_page_params;
928 // Get the size of the resulting metafile. 941 // Get the size of the resulting metafile.
929 if (metafile) { 942 if (metafile) {
930 buf_size = metafile->GetDataSize(); 943 buf_size = metafile->GetDataSize();
931 DCHECK_GT(buf_size, 0u); 944 DCHECK_GT(buf_size, 0u);
932 if (!CopyMetafileDataToSharedMem( 945 if (!CopyMetafileDataToSharedMem(
933 metafile, &(preview_page_params.metafile_data_handle))) { 946 metafile, &(preview_page_params.metafile_data_handle))) {
934 DidFinishPrinting(FAIL_PREVIEW); 947 DidFinishPrinting(FAIL_PREVIEW);
935 return; 948 return;
936 } 949 }
937 } 950 }
938 preview_page_params.data_size = buf_size; 951 preview_page_params.data_size = buf_size;
939 preview_page_params.page_number = page_number; 952 preview_page_params.page_number = page_number;
940 preview_page_params.preview_request_id = 953 preview_page_params.preview_request_id =
941 print_pages_params_->params.preview_request_id; 954 print_pages_params_->params.preview_request_id;
942 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 955 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
943 } 956 }
944 957
945 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 958 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
946 : frame_(NULL), 959 : frame_(NULL),
947 total_page_count_(0), 960 total_page_count_(0),
948 actual_page_count_(0), 961 render_page_list_index_(-1),
949 current_page_number_(0), 962 generate_draft_pages_(true),
963 print_ready_metafile_page_count_(0),
950 state_(UNINITIALIZED) { 964 state_(UNINITIALIZED) {
951 } 965 }
952 966
953 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 967 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
954 } 968 }
955 969
956 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 970 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
957 WebKit::WebFrame* web_frame) { 971 WebKit::WebFrame* web_frame) {
958 DCHECK(web_frame); 972 DCHECK(web_frame);
959 if (IsReadyToRender()) 973 if (IsReadyToRender())
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 // Need to make sure old object gets destroyed first. 1007 // Need to make sure old object gets destroyed first.
994 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), 1008 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(),
995 node())); 1009 node()));
996 UpdatePrintableSizeInPrintParameters(frame_, node_.get(), 1010 UpdatePrintableSizeInPrintParameters(frame_, node_.get(),
997 prep_frame_view_.get(), print_params); 1011 prep_frame_view_.get(), print_params);
998 1012
999 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1013 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
1000 if (total_page_count_ == 0) 1014 if (total_page_count_ == 0)
1001 return false; 1015 return false;
1002 1016
1003 current_page_number_ = 0; 1017 int selected_page_count = pages.size();
1004 if (pages.empty()) { 1018 render_page_list_index_ = -1;
1005 actual_page_count_ = total_page_count_; 1019 print_ready_metafile_page_count_ = pages.empty() ? total_page_count_ :
1006 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, 1020 selected_page_count;
1007 std::make_pair(false, -1)); 1021 render_page_list_ = pages;
1008 } else { 1022 if (selected_page_count == 0) {
1009 actual_page_count_ = pages.size(); 1023 // Render all pages.
1010 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, 1024 for (int i = 0; i < total_page_count_; i++)
1011 std::make_pair(true, -1)); 1025 render_page_list_.push_back(i);
1012 for (int i = 0; i < actual_page_count_; ++i) { 1026 } else if (generate_draft_pages_) {
1013 int page_number = pages[i]; 1027 int pages_index = 0;
1014 if (page_number < printing::FIRST_PAGE_INDEX || 1028 for (int i = 0; i < total_page_count_; i++) {
1015 page_number >= total_page_count_) { 1029 if (pages_index < selected_page_count && i == pages[pages_index]) {
1016 return false; 1030 pages_index++;
1031 continue;
1017 } 1032 }
1018 rendered_pages_[page_number].first = false; 1033 render_page_list_.push_back(i);
1019 rendered_pages_[page_number].second = i;
1020 } 1034 }
1021 } 1035 }
1022 1036
1023 document_render_time_ = base::TimeDelta(); 1037 document_render_time_ = base::TimeDelta();
1024 begin_time_ = base::TimeTicks::Now(); 1038 begin_time_ = base::TimeTicks::Now();
1025 1039
1026 return true; 1040 return true;
1027 } 1041 }
1028 1042
1029 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( 1043 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
1030 const base::TimeDelta& page_time) { 1044 const base::TimeDelta& page_time) {
1031 DCHECK_EQ(RENDERING, state_); 1045 DCHECK_EQ(RENDERING, state_);
1032 document_render_time_ += page_time; 1046 document_render_time_ += page_time;
1033 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); 1047 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time);
1034 } 1048 }
1035 1049
1036 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { 1050 void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() {
1037 DCHECK_EQ(RENDERING, state_); 1051 DCHECK_EQ(RENDERING, state_);
1038 state_ = DONE; 1052 state_ = DONE;
1053 prep_frame_view_->FinishPrinting();
1054 }
1055
1056 void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() {
1057 if (state_ != DONE && state_ != RENDERING)
1058 NOTREACHED();
1039 1059
1040 base::TimeTicks begin_time = base::TimeTicks::Now(); 1060 base::TimeTicks begin_time = base::TimeTicks::Now();
1041
1042 prep_frame_view_->FinishPrinting();
1043 metafile_->FinishDocument(); 1061 metafile_->FinishDocument();
1044 1062
1045 if (actual_page_count_ <= 0) { 1063 if (print_ready_metafile_page_count_ <= 0) {
1046 NOTREACHED(); 1064 NOTREACHED();
1047 return; 1065 return;
1048 } 1066 }
1049 1067
1050 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", 1068 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime",
1051 document_render_time_); 1069 document_render_time_);
1052 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + 1070 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) +
1053 document_render_time_; 1071 document_render_time_;
1054 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", 1072 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime",
1055 total_time); 1073 total_time);
1056 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", 1074 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
1057 total_time / actual_page_count_); 1075 total_time / render_page_list_.size());
1058 } 1076 }
1059 1077
1060 void PrintWebViewHelper::PrintPreviewContext::Finished() { 1078 void PrintWebViewHelper::PrintPreviewContext::Finished() {
1061 DCHECK_EQ(DONE, state_); 1079 DCHECK_EQ(DONE, state_);
1062 ClearContext(); 1080 ClearContext();
1063 } 1081 }
1064 1082
1065 void PrintWebViewHelper::PrintPreviewContext::Failed() { 1083 void PrintWebViewHelper::PrintPreviewContext::Failed() {
1066 DCHECK(IsBusy()); 1084 DCHECK(IsBusy());
1067 state_ = INITIALIZED; 1085 state_ = INITIALIZED;
1068 ClearContext(); 1086 ClearContext();
1069 } 1087 }
1070 1088
1071 void PrintWebViewHelper::PrintPreviewContext::Abort() { 1089 void PrintWebViewHelper::PrintPreviewContext::Abort() {
1072 state_ = UNINITIALIZED; 1090 state_ = UNINITIALIZED;
1073 ClearContext(); 1091 ClearContext();
1074 frame_ = NULL; 1092 frame_ = NULL;
1075 node_.reset(); 1093 node_.reset();
1076 } 1094 }
1077 1095
1078 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1096 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1079 DCHECK_EQ(RENDERING, state_); 1097 DCHECK_EQ(RENDERING, state_);
1080 for (int i = 0; i < total_page_count_; i++) { 1098 if (IsFinalPageRendered())
1081 if (!rendered_pages_[current_page_number_].first)
1082 break;
1083 current_page_number_ = (current_page_number_ + 1) % total_page_count_;
1084 }
1085 if (rendered_pages_[current_page_number_].first)
1086 return printing::INVALID_PAGE_INDEX; 1099 return printing::INVALID_PAGE_INDEX;
1087 rendered_pages_[current_page_number_].first = true; 1100 render_page_list_index_++;
1088 return current_page_number_; 1101 return render_page_list_[render_page_list_index_];
1089 } 1102 }
1090 1103
1091 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { 1104 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1092 return state_ != UNINITIALIZED; 1105 return state_ != UNINITIALIZED;
1093 } 1106 }
1094 1107
1095 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { 1108 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
1096 return state_ == INITIALIZED || state_ == RENDERING; 1109 return state_ == INITIALIZED || state_ == RENDERING;
1097 } 1110 }
1098 1111
1099 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { 1112 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1100 // TODO(vandebo) I think this should only return false if the content is a 1113 // TODO(vandebo) I think this should only return false if the content is a
1101 // PDF, just because we are printing a particular node does not mean it's 1114 // PDF, just because we are printing a particular node does not mean it's
1102 // a PDF (right?), we should check the mime type of the node. 1115 // a PDF (right?), we should check the mime type of the node.
1103 if (node()) 1116 if (node())
1104 return false; 1117 return false;
1105 std::string mime(frame()->dataSource()->response().mimeType().utf8()); 1118 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1106 return mime != "application/pdf"; 1119 return mime != "application/pdf";
1107 } 1120 }
1108 1121
1122 bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile()
1123 const {
1124 return render_page_list_index_ == print_ready_metafile_page_count_ - 1;
1125 }
1126
1127 bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const {
1128 return (size_t)(render_page_list_index_ + 1) == render_page_list_.size();
1129 }
1130
1131 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages(
1132 bool generate_draft_pages) {
1133 generate_draft_pages_ = generate_draft_pages;
1134 }
1135
1109 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { 1136 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1110 return frame_; 1137 return frame_;
1111 } 1138 }
1112 1139
1113 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { 1140 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
1114 return node_.get(); 1141 return node_.get();
1115 } 1142 }
1116 1143
1117 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 1144 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1118 return total_page_count_; 1145 return total_page_count_;
1119 } 1146 }
1120 1147
1148 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() {
1149 return generate_draft_pages_;
1150 }
1151
1121 printing::PreviewMetafile* 1152 printing::PreviewMetafile*
1122 PrintWebViewHelper::PrintPreviewContext::metafile() const { 1153 PrintWebViewHelper::PrintPreviewContext::metafile() const {
1123 return metafile_.get(); 1154 return metafile_.get();
1124 } 1155 }
1125 1156
1126 const PrintMsg_Print_Params& 1157 const PrintMsg_Print_Params&
1127 PrintWebViewHelper::PrintPreviewContext::print_params() const { 1158 PrintWebViewHelper::PrintPreviewContext::print_params() const {
1128 return *print_params_; 1159 return *print_params_;
1129 } 1160 }
1130 1161
1131 const gfx::Size& 1162 const gfx::Size&
1132 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1163 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1133 return prep_frame_view_->GetPrintCanvasSize(); 1164 return prep_frame_view_->GetPrintCanvasSize();
1134 } 1165 }
1135 1166
1136 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1167 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1137 prep_frame_view_.reset(); 1168 prep_frame_view_.reset();
1138 metafile_.reset(); 1169 metafile_.reset();
1139 rendered_pages_.clear(); 1170 render_page_list_.clear();
1140 } 1171 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698