diff options
author | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 16:55:58 +0000 |
---|---|---|
committer | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 16:55:58 +0000 |
commit | ddf90dc66f07c49f91d103f92cebcc489dfcf620 (patch) | |
tree | a8b506ce423e7fd3f9b2b7bec2bf0da49e96a70d /chrome/renderer/print_web_view_helper.cc | |
parent | f12b5127bf168cb15f5cc3446f74c9743cc7e872 (diff) | |
download | chromium_src-ddf90dc66f07c49f91d103f92cebcc489dfcf620.zip chromium_src-ddf90dc66f07c49f91d103f92cebcc489dfcf620.tar.gz chromium_src-ddf90dc66f07c49f91d103f92cebcc489dfcf620.tar.bz2 |
Reland 96406 - Print preview page selection should not require a rerendering of draft pages.
On page selection, regenerate the complete document with the selection, but preserve the existing draft pages and simply display a subset of them.
1. Added a new param |clear all preview data| to |PrintHostMsg_DidGetPreviewPageCount|.
2. Removed |requested_preview_page_index| from |PrintMsg_ContinuePreview|
Review URL: http://codereview.chromium.org/7544018
Original Commit: http://src.chromium.org/viewvc/chrome?view=rev&revision=96406
Revert Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=96414
BUG=84383
TEST=print preview works after code changes.
Review URL: http://codereview.chromium.org/7628019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96567 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/print_web_view_helper.cc')
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 143 |
1 files changed, 88 insertions, 55 deletions
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index b065f31..948fd6e 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_print_ready_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_print_ready_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_.IsLastPageOfPrintReadyMetafile()) { + // 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_print_ready_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_print_ready_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), + print_ready_metafile_page_count_(0), state_(UNINITIALIZED) { } @@ -992,23 +1008,23 @@ 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; + print_ready_metafile_page_count_ = pages.empty() ? total_page_count_ : + selected_page_count; + render_page_list_ = pages; + if (selected_page_count == 0) { + // Render all pages. + 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 +1041,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 (print_ready_metafile_page_count_ <= 0) { NOTREACHED(); return; } @@ -1046,7 +1066,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 +1089,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 +1113,20 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { return mime != "application/pdf"; } +bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() + const { + return render_page_list_index_ == print_ready_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 +1139,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 +1161,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { void PrintWebViewHelper::PrintPreviewContext::ClearContext() { prep_frame_view_.reset(); metafile_.reset(); - rendered_pages_.clear(); + render_page_list_.clear(); } |