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 b065f31b4416deae0f9ecc570ab673dde50736e9..7a2bf3d73388ceff4ecb615b81ddfd98ee970ece 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) { |
| } |
| @@ -313,7 +314,6 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
| NOTREACHED(); |
| return; |
| } |
| - |
| if (!UpdatePrintSettings(settings)) { |
| DidFinishPrinting(FAIL_PREVIEW); |
| return; |
| @@ -334,14 +334,24 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
| preview_params.preview_request_id = |
| print_pages_params_->params.preview_request_id; |
| - Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| + Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), |
| + preview_params)); |
| return; |
| } |
| // 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_.AllPagesRendered(); |
| + |
| + if (print_preview_context_.IsLastPageOfCompleteMetafile()) { |
| + // Finished generating preview. Finalize the document. |
| + if (!FinalizePrintReadyDocument()) |
| + DidFinishPrinting(FAIL_PREVIEW); |
| + } |
| + |
| + if (page_number == printing::INVALID_PAGE_INDEX) { |
| print_preview_context_.Finished(); |
| DidFinishPrinting(OK); |
| - } else { |
| - DidFinishPrinting(FAIL_PREVIEW); |
| } |
| } |
| @@ -394,8 +405,9 @@ void PrintWebViewHelper::OnAbortPreview() { |
| return; |
| } |
| -bool PrintWebViewHelper::FinalizePreviewDocument() { |
| - print_preview_context_.FinalizePreviewDocument(); |
| +bool PrintWebViewHelper::FinalizePrintReadyDocument() { |
| + DCHECK(!is_complete_metafile_sent_); |
| + print_preview_context_.FinalizePrintReadyDocument(); |
| // Get the size of the resulting metafile. |
| printing::PreviewMetafile* metafile = print_preview_context_.metafile(); |
| @@ -417,7 +429,9 @@ bool PrintWebViewHelper::FinalizePreviewDocument() { |
| &(preview_params.metafile_data_handle))) { |
| return false; |
| } |
| - Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| + is_complete_metafile_sent_ = true; |
| + |
| + Send(new PrintHostMsg_MetafileReadyForPrinting(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; |
| + render_page_list_ = pages; |
| + if (selected_page_count == 0) { |
| + DCHECK(generate_draft_pages_); |
|
vandebo (ex-Chrome)
2011/08/10 17:21:40
nit: This DCHECK isn't required with the if-else c
kmadhusu
2011/08/10 19:01:13
Removed.
|
| + // When |pages| is empty, we always generate all draft pages. |
|
vandebo (ex-Chrome)
2011/08/10 17:21:40
With the if-else, this comment isn't valid any mor
kmadhusu
2011/08/10 19:01:13
Fixed the comment.
|
| + // |render_page_list_| will be populated with draft page indices. |
| + for (int i = 0; i < total_page_count_; i++) |
| + render_page_list_.push_back(i); |
| + } else 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::AllPagesRendered() { |
| DCHECK_EQ(RENDERING, state_); |
| state_ = DONE; |
| + prep_frame_view_->FinishPrinting(); |
| +} |
| - base::TimeTicks begin_time = base::TimeTicks::Now(); |
| +void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { |
| + 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 (IsFinalPageRendered()) |
| 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() |
|
vandebo (ex-Chrome)
2011/08/10 17:21:40
Another reference to complete metafile.
kmadhusu
2011/08/10 19:01:13
fixed
|
| + 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::PreviewMetafile* |
| PrintWebViewHelper::PrintPreviewContext::metafile() const { |
| return metafile_.get(); |
| @@ -1128,5 +1163,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| prep_frame_view_.reset(); |
| metafile_.reset(); |
| - rendered_pages_.clear(); |
| + render_page_list_.clear(); |
| } |