Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9974)

Unified Diff: chrome/renderer/print_web_view_helper.cc

Issue 7544018: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698