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

Unified Diff: chrome/renderer/print_web_view_helper.cc

Issue 7647010: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed comment Created 9 years, 4 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 089e69158d5576480526abfa774ff8753cadd96e..0d0ec73573396946af3f62385b8e13bd5f08eacf 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -497,6 +497,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) {
}
@@ -656,14 +657,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 = false;
+ if (!settings.GetBoolean(printing::kSettingGenerateDraftData,
+ &generate_draft_pages)) {
+ NOTREACHED();
+ }
+ print_preview_context_.set_generate_draft_pages(generate_draft_pages);
+
if (CreatePreviewDocument()) {
DidFinishPrinting(OK);
} else {
@@ -683,6 +694,7 @@ bool PrintWebViewHelper::CreatePreviewDocument() {
params.is_modifiable = print_preview_context_.IsModifiable();
params.document_cookie = print_pages_params_->params.document_cookie;
params.preview_request_id = print_pages_params_->params.preview_request_id;
+ params.clear_preview_data = print_preview_context_.generate_draft_pages();
Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params));
if (CheckForCancel())
return false;
@@ -693,17 +705,20 @@ bool PrintWebViewHelper::CreatePreviewDocument() {
return false;
if (CheckForCancel())
return false;
- };
-
- // Finished generating preview. Finalize the document.
- if (!FinalizePreviewDocument())
- return false;
+ if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) {
+ // Finished generating preview. Finalize the document.
+ if (!FinalizePrintReadyDocument())
+ return false;
+ }
+ }
+ print_preview_context_.AllPagesRendered();
print_preview_context_.Finished();
return true;
}
-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();
@@ -726,7 +741,9 @@ bool PrintWebViewHelper::FinalizePreviewDocument() {
LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
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;
}
@@ -1254,8 +1271,10 @@ bool PrintWebViewHelper::PreviewPageRendered(int page_number,
DCHECK_GE(page_number, printing::FIRST_PAGE_INDEX);
// For non-modifiable files, |metafile| should be NULL, so do not bother
- // sending a message.
- if (!print_preview_context_.IsModifiable()) {
+ // sending a message. If we don't generate draft metafiles, |metafile| is
+ // NULL.
+ if (!print_preview_context_.IsModifiable() ||
+ !print_preview_context_.generate_draft_pages()) {
DCHECK(!metafile);
return true;
}
@@ -1286,8 +1305,9 @@ bool PrintWebViewHelper::PreviewPageRendered(int page_number,
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
: frame_(NULL),
total_page_count_(0),
- actual_page_count_(0),
current_page_index_(0),
+ generate_draft_pages_(true),
+ print_ready_metafile_page_count_(0),
state_(UNINITIALIZED) {
}
@@ -1341,22 +1361,24 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
return false;
}
+ int selected_page_count = pages.size();
current_page_index_ = 0;
- if (pages.empty()) {
- actual_page_count_ = total_page_count_;
- for (int i = 0; i < actual_page_count_; ++i)
+ print_ready_metafile_page_count_ = selected_page_count;
+ pages_to_render_ = pages;
+
+ if (selected_page_count == 0) {
+ print_ready_metafile_page_count_ = total_page_count_;
+ // Render all pages.
+ for (int i = 0; i < total_page_count_; i++)
Lei Zhang 2011/09/01 05:16:51 nit: ++i here and below.
kmadhusu 2011/09/01 20:21:16 will submit a new CL to address this.
pages_to_render_.push_back(i);
- } else {
- actual_page_count_ = pages.size();
- 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_) {
- LOG(ERROR) << "CreatePreviewDocument got invalid page count "
- << page_number << " at index " << i;
- return false;
+ } else if (generate_draft_pages_) {
+ int pages_index = 0;
Lei Zhang 2011/09/01 05:16:51 So if I understand this correctly, if the user ope
kmadhusu 2011/09/01 20:21:16 Yes. We generate 999 draft pages only if required.
+ for (int i = 0; i < total_page_count_; i++) {
+ if (pages_index < selected_page_count && i == pages[pages_index]) {
+ pages_index++;
+ continue;
}
- pages_to_render_.push_back(page_number);
+ pages_to_render_.push_back(i);
}
}
@@ -1373,16 +1395,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;
}
@@ -1394,7 +1420,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 / pages_to_render_.size());
}
void PrintWebViewHelper::PrintPreviewContext::Finished() {
@@ -1410,7 +1436,7 @@ void PrintWebViewHelper::PrintPreviewContext::Failed() {
int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
DCHECK_EQ(RENDERING, state_);
- if (current_page_index_ >= actual_page_count_)
+ if ((size_t)(current_page_index_) == pages_to_render_.size())
return -1;
return pages_to_render_[current_page_index_++];
}
@@ -1429,6 +1455,16 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
return mime != "application/pdf";
}
+bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile()
+ const {
+ return current_page_index_ == print_ready_metafile_page_count_;
+}
+
+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_;
}
@@ -1442,6 +1478,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();

Powered by Google App Engine
This is Rietveld 408576698