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 a2c9889e0970b31f5d07868efa8c23c7a68794ab..ed84d5a8c85c38bb6438eb2ac06076eb4392bd8c 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_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_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,38 +364,39 @@ 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; |
| } |
| - // Finished generating preview. Finalize the document. |
| - if (FinalizePreviewDocument()) { |
| + if (print_preview_context_.IsFinalPageRendered()) |
| + print_preview_context_.PreviewPagesRendered(); |
| + |
| + if (print_preview_context_.IsLastPageOfCompleteMetafile()) { |
| + // Finished generating preview. Finalize the document. |
| + if (!FinalizePreviewDocument()) |
|
vandebo (ex-Chrome)
2011/08/08 20:11:46
nit: FinalizeCompleteMetafile ? Actually we've be
kmadhusu
2011/08/09 22:09:26
FinalizeCompleteMetafile => FinalizePrintReadyDocu
|
| + DidFinishPrinting(FAIL_PREVIEW); |
| + } |
| + |
| + if (page_number == printing::INVALID_PAGE_INDEX) { |
| print_preview_context_.Finished(); |
| DidFinishPrinting(OK); |
| - } else { |
| - DidFinishPrinting(FAIL_PREVIEW); |
| } |
| } |
| @@ -395,6 +406,7 @@ void PrintWebViewHelper::OnAbortPreview() { |
| } |
| bool PrintWebViewHelper::FinalizePreviewDocument() { |
| + DCHECK(!is_complete_metafile_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_sent_ = true; |
| + |
| Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| return true; |
| } |
| @@ -911,7 +925,8 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, |
| printing::Metafile* metafile) { |
| if ((page_number == printing::INVALID_PAGE_INDEX && metafile) || |
| (page_number >= printing::FIRST_PAGE_INDEX && !metafile && |
| - print_preview_context_.IsModifiable())) { |
| + print_preview_context_.IsModifiable() && |
| + print_preview_context_.generate_draft_pages())) { |
| NOTREACHED(); |
| DidFinishPrinting(FAIL_PREVIEW); |
| return; |
| @@ -937,8 +952,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 +1008,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)); |
| - } 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; |
| + 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/08 20:11:46
nit: This comment explain things fine, but it occu
kmadhusu
2011/08/09 22:09:26
Done.
|
| + // |render_page_list_| will be populated with draft page indices. |
| + DCHECK(generate_draft_pages_); |
| + } |
| + render_page_list_ = pages; |
| + |
| + if (generate_draft_pages_) { |
| + int pages_index = 0; |
| + for (int i = 0; i < total_page_count_; i++) { |
| + if (pages_index < selected_page_count && i == pages[pages_index]) { |
| + pages_index++; |
| + continue; |
| } |
| - rendered_pages_[page_number].first = false; |
| - rendered_pages_[page_number].second = i; |
| + render_page_list_.push_back(i); |
| } |
| } |
| @@ -1025,16 +1043,20 @@ 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() { |
| + if (state_ != DONE && state_ != RENDERING) |
| + NOTREACHED(); |
| - 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() { |
| @@ -1069,15 +1091,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()) |
|
vandebo (ex-Chrome)
2011/08/08 20:11:46
This can use IsFinalPageRendered()
kmadhusu
2011/08/09 22:09:26
Done.
|
| 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 { |
| @@ -1098,6 +1115,20 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
| return mime != "application/pdf"; |
| } |
| +bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfCompleteMetafile() |
| + const { |
| + return render_page_list_index_ == complete_metafile_page_count_ - 1; |
| +} |
| + |
| +bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const { |
| + return (size_t)(render_page_list_index_ + 1) == render_page_list_.size(); |
| +} |
| + |
| +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_; |
| } |
| @@ -1110,6 +1141,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(); |
| } |
| @@ -1127,5 +1162,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| prep_frame_view_.reset(); |
| metafile_.reset(); |
| - rendered_pages_.clear(); |
| + render_page_list_.clear(); |
| } |