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 #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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |