| 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..948fd6e6105e25b5b6402fd7f1a1b31db28b6b05 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();
|
| }
|
|
|