diff options
Diffstat (limited to 'chrome/renderer/print_web_view_helper.cc')
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 143 |
1 files changed, 55 insertions, 88 deletions
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index 948fd6e..b065f31 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -177,7 +177,6 @@ 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) { } @@ -314,6 +313,7 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { NOTREACHED(); return; } + if (!UpdatePrintSettings(settings)) { DidFinishPrinting(FAIL_PREVIEW); return; @@ -334,24 +334,14 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { preview_params.preview_request_id = print_pages_params_->params.preview_request_id; - Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), - preview_params)); + Send(new PrintHostMsg_PagesReadyForPreview(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); } @@ -364,39 +354,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, - print_preview_context_.generate_draft_pages())); + Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, + page_count, is_modifiable)); PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); return true; } -void PrintWebViewHelper::OnContinuePreview() { +void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) { // Spurious message. We already finished/cancelled/aborted the print preview. if (!print_preview_context_.IsBusy()) return; - int page_number = print_preview_context_.GetNextPageNumber(); + 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(); + } if (page_number >= printing::FIRST_PAGE_INDEX) { // Continue generating the print preview. RenderPreviewPage(page_number); + return; } - 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) { + // Finished generating preview. Finalize the document. + if (FinalizePreviewDocument()) { print_preview_context_.Finished(); DidFinishPrinting(OK); + } else { + DidFinishPrinting(FAIL_PREVIEW); } } @@ -405,9 +394,8 @@ void PrintWebViewHelper::OnAbortPreview() { return; } -bool PrintWebViewHelper::FinalizePrintReadyDocument() { - DCHECK(!is_print_ready_metafile_sent_); - print_preview_context_.FinalizePrintReadyDocument(); +bool PrintWebViewHelper::FinalizePreviewDocument() { + print_preview_context_.FinalizePreviewDocument(); // Get the size of the resulting metafile. printing::PreviewMetafile* metafile = print_preview_context_.metafile(); @@ -429,9 +417,7 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() { &(preview_params.metafile_data_handle))) { return false; } - is_print_ready_metafile_sent_ = true; - - Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); + Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); return true; } @@ -925,8 +911,7 @@ 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_.generate_draft_pages())) { + print_preview_context_.IsModifiable())) { NOTREACHED(); DidFinishPrinting(FAIL_PREVIEW); return; @@ -952,9 +937,8 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() : frame_(NULL), total_page_count_(0), - render_page_list_index_(-1), - generate_draft_pages_(true), - print_ready_metafile_page_count_(0), + actual_page_count_(0), + current_page_number_(0), state_(UNINITIALIZED) { } @@ -1008,23 +992,23 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( if (total_page_count_ == 0) 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; + 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; } - render_page_list_.push_back(i); + rendered_pages_[page_number].first = false; + rendered_pages_[page_number].second = i; } } @@ -1041,20 +1025,16 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); } -void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() { +void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { DCHECK_EQ(RENDERING, state_); state_ = DONE; - prep_frame_view_->FinishPrinting(); -} - -void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { - if (state_ != DONE && state_ != RENDERING) - NOTREACHED(); base::TimeTicks begin_time = base::TimeTicks::Now(); + + prep_frame_view_->FinishPrinting(); metafile_->FinishDocument(); - if (print_ready_metafile_page_count_ <= 0) { + if (actual_page_count_ <= 0) { NOTREACHED(); return; } @@ -1066,7 +1046,7 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", total_time); UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", - total_time / render_page_list_.size()); + total_time / actual_page_count_); } void PrintWebViewHelper::PrintPreviewContext::Finished() { @@ -1089,10 +1069,15 @@ void PrintWebViewHelper::PrintPreviewContext::Abort() { int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { DCHECK_EQ(RENDERING, state_); - if (IsFinalPageRendered()) + 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) return printing::INVALID_PAGE_INDEX; - render_page_list_index_++; - return render_page_list_[render_page_list_index_]; + rendered_pages_[current_page_number_].first = true; + return current_page_number_; } bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { @@ -1113,20 +1098,6 @@ 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_; } @@ -1139,10 +1110,6 @@ 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(); @@ -1161,5 +1128,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { void PrintWebViewHelper::PrintPreviewContext::ClearContext() { prep_frame_view_.reset(); metafile_.reset(); - render_page_list_.clear(); + rendered_pages_.clear(); } |