| Index: chrome/renderer/print_web_view_helper.cc
|
| ===================================================================
|
| --- chrome/renderer/print_web_view_helper.cc (revision 96579)
|
| +++ chrome/renderer/print_web_view_helper.cc (working copy)
|
| @@ -177,7 +177,6 @@
|
| 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 @@
|
| NOTREACHED();
|
| return;
|
| }
|
| +
|
| if (!UpdatePrintSettings(settings)) {
|
| DidFinishPrinting(FAIL_PREVIEW);
|
| return;
|
| @@ -334,24 +334,14 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| &(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 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
|
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
|
| prep_frame_view_.reset();
|
| metafile_.reset();
|
| - render_page_list_.clear();
|
| + rendered_pages_.clear();
|
| }
|
|
|