| 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 7ad456ff47cbbfc7acd57c6b0aca0fa3404d0e73..653be2955887275b11b1f038b149357721146b2f 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,19 @@ 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)) {
|
| + // TODO(kmadhusu): Remove this key.
|
| + NOTREACHED();
|
| + }
|
| + print_preview_context_.set_generate_draft_pages(generate_draft_pages);
|
| +
|
| if (!CreatePreviewDocument())
|
| DidFinishPrinting(FAIL_PREVIEW);
|
| }
|
| @@ -354,36 +365,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_.get_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())
|
| + 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 +404,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_)
|
| + return true;
|
|
|
| // Get the size of the resulting metafile.
|
| printing::Metafile* metafile = print_preview_context_.metafile();
|
| @@ -417,6 +429,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;
|
| }
|
| @@ -939,8 +953,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),
|
| + current_page_index_(-1),
|
| state_(UNINITIALIZED) {
|
| }
|
|
|
| @@ -994,25 +1009,24 @@ 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;
|
| + current_page_index_ = -1;
|
| + complete_metafile_page_count_ = pages.empty() ? total_page_count_ :
|
| + pages.size();
|
| + render_page_index_list_ = pages;
|
| + if (generate_draft_pages_) {
|
| + for (int i = 0; i < total_page_count_; i++) {
|
| + if (std::find(pages.begin(), pages.end(), i) == pages.end())
|
| + render_page_index_list_.push_back(i);
|
| }
|
| }
|
| + // printf("---------------------\n");
|
| + // printf("complete_metafile_page_count_: %d \n",
|
| + // complete_metafile_page_count_);
|
| + // printf("total_page_count_: %d \n", total_page_count_);
|
| + // printf("pages.size: %ld \n", pages.size());
|
| + // printf("render_page_index_list_: %ld \n", render_page_index_list_.size());
|
| + // printf("generate_draft_pages: %d \n", generate_draft_pages_);
|
| + // printf("---------------------\n");
|
|
|
| document_render_time_ = base::TimeDelta();
|
| begin_time_ = base::TimeTicks::Now();
|
| @@ -1027,16 +1041,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)(current_page_index_ + 1) == render_page_index_list_.size()) {
|
| + state_ = DONE;
|
| + prep_frame_view_->FinishPrinting();
|
| + 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;
|
| }
|
| @@ -1048,7 +1066,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() {
|
| @@ -1065,15 +1083,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)(current_page_index_ + 1) >= render_page_index_list_.size())
|
| return printing::INVALID_PAGE_INDEX;
|
| - rendered_pages_[current_page_number_].first = true;
|
| - return current_page_number_;
|
| + current_page_index_++;
|
| + return render_page_index_list_[current_page_index_];
|
| }
|
|
|
| bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
|
| @@ -1094,10 +1107,19 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
|
| return mime != "application/pdf";
|
| }
|
|
|
| +bool PrintWebViewHelper::PrintPreviewContext::IsCompleteMetafileReady() const {
|
| + return current_page_index_ == complete_metafile_page_count_ - 1;
|
| +}
|
| +
|
| +// TODO(kmadhusu): Remove GetPageSlotForPage() function.
|
| int PrintWebViewHelper::PrintPreviewContext::GetPageSlotForPage(
|
| int page_number) const {
|
| - int page_slot = rendered_pages_[page_number].second;
|
| - return page_slot == -1 ? page_number : page_slot;
|
| + std::vector<int>::const_iterator it =
|
| + std::find(render_page_index_list_.begin(), render_page_index_list_.end(),
|
| + page_number);
|
| + int page_slot = it != render_page_index_list_.end() ?
|
| + static_cast<int>(it - render_page_index_list_.begin()) : -1;
|
| + return page_slot >= complete_metafile_page_count_ ? 0 : page_slot;
|
| }
|
|
|
| WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
|
| @@ -1129,5 +1151,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
|
| void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
|
| prep_frame_view_.reset();
|
| metafile_.reset();
|
| - rendered_pages_.clear();
|
| + render_page_index_list_.clear();
|
| }
|
|
|