Chromium Code Reviews| Index: chrome/renderer/print_web_view_helper.cc |
| diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc |
| index 1735d90b7e661e1a46a8eebc778efd4688d310ab..e496f517364821c3bd8ee7034d9227e0c10c5a8e 100644 |
| --- a/chrome/renderer/print_web_view_helper.cc |
| +++ b/chrome/renderer/print_web_view_helper.cc |
| @@ -177,6 +177,7 @@ PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) |
| RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| print_web_view_(NULL), |
| is_preview_(switches::IsPrintPreviewEnabled()), |
| + is_complete_metafile_already_sent_(false), |
| user_cancelled_scripted_print_count_(0), |
| notify_browser_of_print_failure_(true) { |
| } |
| @@ -339,9 +340,18 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
| } |
| // Always clear |old_print_pages_params_| before rendering the pages. |
| old_print_pages_params_.reset(); |
| + is_complete_metafile_already_sent_ = false; |
| // PDF printer device supports alpha blending. |
| print_pages_params_->params.supports_alpha_blend = true; |
| + |
| + bool generate_draft_pages; |
| + if (!settings.GetBoolean(printing::kSettingGenerateDraftData, |
| + &generate_draft_pages)) { |
| + NOTREACHED(); |
| + } |
| + print_preview_context_.set_generate_draft_pages(generate_draft_pages); |
| + |
| if (!CreatePreviewDocument()) |
| DidFinishPrinting(FAIL_PREVIEW); |
| } |
| @@ -354,36 +364,34 @@ bool PrintWebViewHelper::CreatePreviewDocument() { |
| int page_count = print_preview_context_.total_page_count(); |
| bool is_modifiable = print_preview_context_.IsModifiable(); |
| int document_cookie = print_pages_params_->params.document_cookie; |
| - Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, |
| - page_count, is_modifiable)); |
| + Send(new PrintHostMsg_DidGetPreviewPageCount( |
| + routing_id(), |
| + document_cookie, |
| + page_count, |
| + is_modifiable, |
| + print_preview_context_.generate_draft_pages())); |
| PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); |
| return true; |
| } |
| -void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) { |
| +void PrintWebViewHelper::OnContinuePreview() { |
| // Spurious message. We already finished/cancelled/aborted the print preview. |
| if (!print_preview_context_.IsBusy()) |
| return; |
| - int page_number; |
| -#if defined(USE_SKIA) |
| - if (requested_preview_page_index >= printing::FIRST_PAGE_INDEX) { |
| - page_number = requested_preview_page_index; |
| - } else |
| -#endif |
| - { |
| - page_number = print_preview_context_.GetNextPageNumber(); |
| - } |
| - |
| + int page_number = print_preview_context_.GetNextPageNumber(); |
| if (page_number >= printing::FIRST_PAGE_INDEX) { |
| // Continue generating the print preview. |
| RenderPreviewPage(page_number); |
| - return; |
| + if (!print_preview_context_.IsCompleteMetafileReady()) |
|
vandebo (ex-Chrome)
2011/08/03 20:48:21
I think we want to return except for the one page
kmadhusu
2011/08/04 20:47:53
As we discussed, I renamed the function "IsComple
|
| + return; |
| } |
| // Finished generating preview. Finalize the document. |
| if (FinalizePreviewDocument()) { |
| - print_preview_context_.Finished(); |
| - DidFinishPrinting(OK); |
| + if (page_number == printing::INVALID_PAGE_INDEX) { |
| + print_preview_context_.Finished(); |
| + DidFinishPrinting(OK); |
| + } |
| } else { |
| DidFinishPrinting(FAIL_PREVIEW); |
| } |
| @@ -395,7 +403,10 @@ void PrintWebViewHelper::OnAbortPreview() { |
| } |
| bool PrintWebViewHelper::FinalizePreviewDocument() { |
| - print_preview_context_.FinalizePreviewDocument(); |
| + print_preview_context_.FinalizePreviewDocument( |
| + is_complete_metafile_already_sent_); |
| + if (is_complete_metafile_already_sent_) |
|
vandebo (ex-Chrome)
2011/08/03 20:48:21
Ohh, I see you handle that here... I think it woul
kmadhusu
2011/08/04 20:47:53
Done.
|
| + return true; |
| // Get the size of the resulting metafile. |
| printing::Metafile* metafile = print_preview_context_.metafile(); |
| @@ -417,6 +428,8 @@ bool PrintWebViewHelper::FinalizePreviewDocument() { |
| &(preview_params.metafile_data_handle))) { |
| return false; |
| } |
| + is_complete_metafile_already_sent_ = true; |
| + |
| Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| return true; |
| } |
| @@ -937,8 +950,9 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, |
| PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
| : frame_(NULL), |
| total_page_count_(0), |
| - actual_page_count_(0), |
| - current_page_number_(0), |
| + generate_draft_pages_(true), |
| + complete_metafile_page_count_(0), |
| + render_page_list_index_(-1), |
| state_(UNINITIALIZED) { |
| } |
| @@ -992,26 +1006,16 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( |
| if (total_page_count_ == 0) |
| return false; |
| - current_page_number_ = 0; |
| - if (pages.empty()) { |
| - actual_page_count_ = total_page_count_; |
| - rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, |
| - std::make_pair(false, -1)); |
| - } else { |
| - actual_page_count_ = pages.size(); |
| - rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, |
| - std::make_pair(true, -1)); |
| - for (int i = 0; i < actual_page_count_; ++i) { |
| - int page_number = pages[i]; |
| - if (page_number < printing::FIRST_PAGE_INDEX || |
| - page_number >= total_page_count_) { |
| - return false; |
| - } |
| - rendered_pages_[page_number].first = false; |
| - rendered_pages_[page_number].second = i; |
| + render_page_list_index_ = -1; |
| + complete_metafile_page_count_ = pages.empty() ? total_page_count_ : |
| + pages.size(); |
| + render_page_list_ = pages; |
|
vandebo (ex-Chrome)
2011/08/03 20:48:21
what about if pages is empty? In most cases it'll
kmadhusu
2011/08/04 20:47:53
As we discussed, I added a DCHECK(generate_drate_p
|
| + if (generate_draft_pages_) { |
| + for (int i = 0; i < total_page_count_; i++) { |
| + if (std::find(pages.begin(), pages.end(), i) == pages.end()) |
|
vandebo (ex-Chrome)
2011/08/03 20:48:21
if render_page_list_ is guaranteed to be in order,
kmadhusu
2011/08/04 20:47:53
Done.
|
| + render_page_list_.push_back(i); |
| } |
| } |
| - |
| document_render_time_ = base::TimeDelta(); |
| begin_time_ = base::TimeTicks::Now(); |
| @@ -1025,16 +1029,20 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( |
| UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); |
| } |
| -void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| +void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument( |
| + bool is_complete_metafile_already_sent) { |
| DCHECK_EQ(RENDERING, state_); |
| - state_ = DONE; |
| + if ((size_t)(render_page_list_index_ + 1) == render_page_list_.size()) { |
| + state_ = DONE; |
| + prep_frame_view_->FinishPrinting(); |
|
vandebo (ex-Chrome)
2011/08/03 20:48:21
Is this left over from trying to do PDFs?
kmadhusu
2011/08/04 20:47:53
No.
|
| + if (is_complete_metafile_already_sent) |
| + return; |
| + } |
| base::TimeTicks begin_time = base::TimeTicks::Now(); |
| - |
| - prep_frame_view_->FinishPrinting(); |
| metafile_->FinishDocument(); |
| - if (actual_page_count_ <= 0) { |
| + if (complete_metafile_page_count_ <= 0) { |
| NOTREACHED(); |
| return; |
| } |
| @@ -1046,7 +1054,7 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", |
| total_time); |
| UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", |
| - total_time / actual_page_count_); |
| + total_time / complete_metafile_page_count_); |
| } |
| void PrintWebViewHelper::PrintPreviewContext::Finished() { |
| @@ -1063,15 +1071,10 @@ void PrintWebViewHelper::PrintPreviewContext::Abort() { |
| int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { |
| DCHECK_EQ(RENDERING, state_); |
| - for (int i = 0; i < total_page_count_; i++) { |
| - if (!rendered_pages_[current_page_number_].first) |
| - break; |
| - current_page_number_ = (current_page_number_ + 1) % total_page_count_; |
| - } |
| - if (rendered_pages_[current_page_number_].first) |
| + if ((size_t)(render_page_list_index_ + 1) >= render_page_list_.size()) |
| return printing::INVALID_PAGE_INDEX; |
| - rendered_pages_[current_page_number_].first = true; |
| - return current_page_number_; |
| + render_page_list_index_++; |
| + return render_page_list_[render_page_list_index_]; |
| } |
| bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { |
| @@ -1092,6 +1095,10 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
| return mime != "application/pdf"; |
| } |
| +bool PrintWebViewHelper::PrintPreviewContext::IsCompleteMetafileReady() const { |
| + return render_page_list_index_ == complete_metafile_page_count_ - 1; |
| +} |
| + |
| WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
| return frame_; |
| } |
| @@ -1121,5 +1128,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| prep_frame_view_.reset(); |
| metafile_.reset(); |
| - rendered_pages_.clear(); |
| + render_page_list_.clear(); |
| } |