summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/print_web_view_helper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/print_web_view_helper.cc')
-rw-r--r--chrome/renderer/print_web_view_helper.cc143
1 files changed, 55 insertions, 88 deletions
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
index 948fd6e..b065f31 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -177,7 +177,6 @@ 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) {
}
@@ -314,6 +313,7 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
NOTREACHED();
return;
}
+
if (!UpdatePrintSettings(settings)) {
DidFinishPrinting(FAIL_PREVIEW);
return;
@@ -334,24 +334,14 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
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 @@ 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,
- 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 @@ void PrintWebViewHelper::OnAbortPreview() {
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 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() {
&(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 @@ 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_.generate_draft_pages())) {
+ print_preview_context_.IsModifiable())) {
NOTREACHED();
DidFinishPrinting(FAIL_PREVIEW);
return;
@@ -952,9 +937,8 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number,
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 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
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 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
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 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() {
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 @@ void PrintWebViewHelper::PrintPreviewContext::Abort() {
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 @@ 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_;
}
@@ -1139,10 +1110,6 @@ 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();
@@ -1161,5 +1128,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
prep_frame_view_.reset();
metafile_.reset();
- render_page_list_.clear();
+ rendered_pages_.clear();
}