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