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 1735d90b7e661e1a46a8eebc778efd4688d310ab..e496f517364821c3bd8ee7034d9227e0c10c5a8e 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_complete_metafile_already_sent_(false), |
user_cancelled_scripted_print_count_(0), |
notify_browser_of_print_failure_(true) { |
} |
@@ -339,9 +340,18 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
} |
// Always clear |old_print_pages_params_| before rendering the pages. |
old_print_pages_params_.reset(); |
+ is_complete_metafile_already_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,36 +364,34 @@ 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; |
+ if (!print_preview_context_.IsCompleteMetafileReady()) |
vandebo (ex-Chrome)
2011/08/03 20:48:21
I think we want to return except for the one page
kmadhusu
2011/08/04 20:47:53
As we discussed, I renamed the function "IsComple
|
+ return; |
} |
// Finished generating preview. Finalize the document. |
if (FinalizePreviewDocument()) { |
- print_preview_context_.Finished(); |
- DidFinishPrinting(OK); |
+ if (page_number == printing::INVALID_PAGE_INDEX) { |
+ print_preview_context_.Finished(); |
+ DidFinishPrinting(OK); |
+ } |
} else { |
DidFinishPrinting(FAIL_PREVIEW); |
} |
@@ -395,7 +403,10 @@ void PrintWebViewHelper::OnAbortPreview() { |
} |
bool PrintWebViewHelper::FinalizePreviewDocument() { |
- print_preview_context_.FinalizePreviewDocument(); |
+ print_preview_context_.FinalizePreviewDocument( |
+ is_complete_metafile_already_sent_); |
+ if (is_complete_metafile_already_sent_) |
vandebo (ex-Chrome)
2011/08/03 20:48:21
Ohh, I see you handle that here... I think it woul
kmadhusu
2011/08/04 20:47:53
Done.
|
+ return true; |
// Get the size of the resulting metafile. |
printing::Metafile* metafile = print_preview_context_.metafile(); |
@@ -417,6 +428,8 @@ bool PrintWebViewHelper::FinalizePreviewDocument() { |
&(preview_params.metafile_data_handle))) { |
return false; |
} |
+ is_complete_metafile_already_sent_ = true; |
+ |
Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
return true; |
} |
@@ -937,8 +950,9 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, |
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
: frame_(NULL), |
total_page_count_(0), |
- actual_page_count_(0), |
- current_page_number_(0), |
+ generate_draft_pages_(true), |
+ complete_metafile_page_count_(0), |
+ render_page_list_index_(-1), |
state_(UNINITIALIZED) { |
} |
@@ -992,26 +1006,16 @@ 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; |
- } |
- rendered_pages_[page_number].first = false; |
- rendered_pages_[page_number].second = i; |
+ render_page_list_index_ = -1; |
+ complete_metafile_page_count_ = pages.empty() ? total_page_count_ : |
+ pages.size(); |
+ render_page_list_ = pages; |
vandebo (ex-Chrome)
2011/08/03 20:48:21
what about if pages is empty? In most cases it'll
kmadhusu
2011/08/04 20:47:53
As we discussed, I added a DCHECK(generate_drate_p
|
+ if (generate_draft_pages_) { |
+ for (int i = 0; i < total_page_count_; i++) { |
+ if (std::find(pages.begin(), pages.end(), i) == pages.end()) |
vandebo (ex-Chrome)
2011/08/03 20:48:21
if render_page_list_ is guaranteed to be in order,
kmadhusu
2011/08/04 20:47:53
Done.
|
+ render_page_list_.push_back(i); |
} |
} |
- |
document_render_time_ = base::TimeDelta(); |
begin_time_ = base::TimeTicks::Now(); |
@@ -1025,16 +1029,20 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( |
UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); |
} |
-void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
+void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument( |
+ bool is_complete_metafile_already_sent) { |
DCHECK_EQ(RENDERING, state_); |
- state_ = DONE; |
+ if ((size_t)(render_page_list_index_ + 1) == render_page_list_.size()) { |
+ state_ = DONE; |
+ prep_frame_view_->FinishPrinting(); |
vandebo (ex-Chrome)
2011/08/03 20:48:21
Is this left over from trying to do PDFs?
kmadhusu
2011/08/04 20:47:53
No.
|
+ if (is_complete_metafile_already_sent) |
+ return; |
+ } |
base::TimeTicks begin_time = base::TimeTicks::Now(); |
- |
- prep_frame_view_->FinishPrinting(); |
metafile_->FinishDocument(); |
- if (actual_page_count_ <= 0) { |
+ if (complete_metafile_page_count_ <= 0) { |
NOTREACHED(); |
return; |
} |
@@ -1046,7 +1054,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 / complete_metafile_page_count_); |
} |
void PrintWebViewHelper::PrintPreviewContext::Finished() { |
@@ -1063,15 +1071,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 ((size_t)(render_page_list_index_ + 1) >= render_page_list_.size()) |
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 { |
@@ -1092,6 +1095,10 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
return mime != "application/pdf"; |
} |
+bool PrintWebViewHelper::PrintPreviewContext::IsCompleteMetafileReady() const { |
+ return render_page_list_index_ == complete_metafile_page_count_ - 1; |
+} |
+ |
WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
return frame_; |
} |
@@ -1121,5 +1128,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
prep_frame_view_.reset(); |
metafile_.reset(); |
- rendered_pages_.clear(); |
+ render_page_list_.clear(); |
} |