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