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..541ae857d167acc6e71e3cf06354f0a658d70a99 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); |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
If you like, you could make set_generate_draft_pag
kmadhusu
2011/08/05 22:55:22
I prefer the existing code.
|
| + |
| if (!CreatePreviewDocument()) |
| DidFinishPrinting(FAIL_PREVIEW); |
| } |
| @@ -354,37 +364,38 @@ 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(), |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
nit: 4 space indent.
kmadhusu
2011/08/05 22:55:22
Done.
|
| + 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_.IsLastPageOfCompleteMetafile()) |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
This is still a bit confusing/interwoven... I sug
kmadhusu
2011/08/05 22:55:22
Done.
|
| + return; |
| } |
| - // Finished generating preview. Finalize the document. |
| - if (FinalizePreviewDocument()) { |
| + if (is_complete_metafile_already_sent_ && |
| + page_number == printing::INVALID_PAGE_INDEX) { |
| + print_preview_context_.PreviewPagesRendered(); |
| print_preview_context_.Finished(); |
| DidFinishPrinting(OK); |
| - } else { |
| + return; |
| + } |
| + |
| + // Finished generating preview. Finalize the document. |
| + if (!FinalizePreviewDocument()) { |
| DidFinishPrinting(FAIL_PREVIEW); |
| } |
| } |
| @@ -395,6 +406,7 @@ void PrintWebViewHelper::OnAbortPreview() { |
| } |
| bool PrintWebViewHelper::FinalizePreviewDocument() { |
| + DCHECK(!is_complete_metafile_already_sent_); |
| print_preview_context_.FinalizePreviewDocument(); |
| // Get the size of the resulting metafile. |
| @@ -417,6 +429,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 +951,9 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, |
| PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
| : frame_(NULL), |
| total_page_count_(0), |
| - actual_page_count_(0), |
| - current_page_number_(0), |
| + render_page_list_index_(-1), |
| + generate_draft_pages_(true), |
| + complete_metafile_page_count_(0), |
| state_(UNINITIALIZED) { |
| } |
| @@ -992,23 +1007,25 @@ 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)); |
| + int selected_page_count = pages.size(); |
| + render_page_list_index_ = -1; |
| + complete_metafile_page_count_ = pages.empty() ? total_page_count_ : |
| + selected_page_count; |
| + if (selected_page_count == 0) { |
| + // When |pages| is empty, we always generate all draft pages. |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
I was hoping for a bit more here... "And render_p
kmadhusu
2011/08/05 22:55:22
Done.
|
| + DCHECK(generate_draft_pages_); |
| } 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; |
| + render_page_list_ = pages; |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
If you like, this can be done unconditionally - ei
kmadhusu
2011/08/05 22:55:22
Done.
|
| + } |
| + |
| + if (generate_draft_pages_) { |
| + int index = 0; |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
nit: pages_index ?
kmadhusu
2011/08/05 22:55:22
Done.
|
| + for (int i = 0; i < total_page_count_; i++) { |
| + if (index < selected_page_count && i == pages[index]) { |
| + index++; |
| + continue; |
| } |
| - rendered_pages_[page_number].first = false; |
| - rendered_pages_[page_number].second = i; |
| + render_page_list_.push_back(i); |
| } |
| } |
| @@ -1025,16 +1042,21 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( |
| UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); |
| } |
| -void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| +void PrintWebViewHelper::PrintPreviewContext::PreviewPagesRendered() { |
| DCHECK_EQ(RENDERING, state_); |
| state_ = DONE; |
| + prep_frame_view_->FinishPrinting(); |
| +} |
| - base::TimeTicks begin_time = base::TimeTicks::Now(); |
| +void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| + DCHECK_EQ(RENDERING, state_); |
| + if ((size_t)(render_page_list_index_ + 1) == render_page_list_.size()) |
| + PreviewPagesRendered(); |
|
vandebo (ex-Chrome)
2011/08/04 21:45:02
I think the reordering suggestion I made in OnCont
kmadhusu
2011/08/05 22:55:22
Removed.
|
| - prep_frame_view_->FinishPrinting(); |
| + base::TimeTicks begin_time = base::TimeTicks::Now(); |
| metafile_->FinishDocument(); |
| - if (actual_page_count_ <= 0) { |
| + if (complete_metafile_page_count_ <= 0) { |
| NOTREACHED(); |
| return; |
| } |
| @@ -1046,7 +1068,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 / render_page_list_.size()); |
| } |
| void PrintWebViewHelper::PrintPreviewContext::Finished() { |
| @@ -1063,15 +1085,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 +1109,16 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
| return mime != "application/pdf"; |
| } |
| +bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfCompleteMetafile() |
| + const { |
| + return render_page_list_index_ == complete_metafile_page_count_ - 1; |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( |
| + bool generate_draft_pages) { |
| + generate_draft_pages_ = generate_draft_pages; |
| +} |
| + |
| WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
| return frame_; |
| } |
| @@ -1104,6 +1131,10 @@ int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
| return total_page_count_; |
| } |
| +bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { |
| + return generate_draft_pages_; |
| +} |
| + |
| printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const { |
| return metafile_.get(); |
| } |
| @@ -1121,5 +1152,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| prep_frame_view_.reset(); |
| metafile_.reset(); |
| - rendered_pages_.clear(); |
| + render_page_list_.clear(); |
| } |