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.cc89
1 files changed, 71 insertions, 18 deletions
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
index 8430356..028fe2d 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -337,6 +337,8 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
return;
}
+ // Always clear |old_print_pages_params_| before rendering the pages.
+ old_print_pages_params_.reset();
// PDF printer device supports alpha blending.
print_pages_params_->params.supports_alpha_blend = true;
@@ -350,20 +352,29 @@ bool PrintWebViewHelper::CreatePreviewDocument() {
if (!print_preview_context_.CreatePreviewDocument(&print_params, pages))
return false;
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));
- PreviewPageRendered(-1);
+ 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;
+#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 >= 0) {
+ if (page_number >= printing::FIRST_PAGE_INDEX) {
// Continue generating the print preview.
RenderPreviewPage(page_number);
return;
@@ -576,6 +587,7 @@ bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params,
if (params.pages.empty()) {
for (int i = 0; i < page_count; ++i) {
page_params.page_number = i;
+ page_params.page_slot = i;
PrintPageInternal(page_params, canvas_size, frame);
}
} else {
@@ -583,6 +595,7 @@ bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params,
if (params.pages[i] >= page_count)
break;
page_params.page_number = params.pages[i];
+ page_params.page_slot = i;
PrintPageInternal(page_params, canvas_size, frame);
}
}
@@ -901,8 +914,33 @@ void PrintWebViewHelper::RequestPrintPreview() {
Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
}
-void PrintWebViewHelper::PreviewPageRendered(int page_number) {
- Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number));
+void PrintWebViewHelper::PreviewPageRendered(int page_number,
+ printing::Metafile* metafile) {
+#if !defined(OS_WIN)
+ if ((page_number == printing::INVALID_PAGE_INDEX && metafile) ||
+ (page_number >= printing::FIRST_PAGE_INDEX && !metafile &&
+ print_preview_context_.IsModifiable())) {
+ NOTREACHED();
+ DidFinishPrinting(FAIL_PREVIEW);
+ return;
+ }
+#endif
+
+ uint32 buf_size = 0;
+ PrintHostMsg_DidPreviewPage_Params preview_page_params;
+ // Get the size of the resulting metafile.
+ if (metafile) {
+ buf_size = metafile->GetDataSize();
+ DCHECK_GT(buf_size, 0u);
+ if (!CopyMetafileDataToSharedMem(
+ metafile, &(preview_page_params.metafile_data_handle))) {
+ DidFinishPrinting(FAIL_PREVIEW);
+ return;
+ }
+ }
+ preview_page_params.data_size = buf_size;
+ preview_page_params.page_number = page_number;
+ Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
}
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
@@ -966,15 +1004,20 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
current_page_number_ = 0;
if (pages.empty()) {
actual_page_count_ = total_page_count_;
- rendered_pages_ = std::vector<bool>(total_page_count_, false);
+ rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_,
+ std::make_pair(false, -1));
} else {
actual_page_count_ = pages.size();
- rendered_pages_ = std::vector<bool>(total_page_count_, true);
+ 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 < 0 || page_number >= total_page_count_)
+ if (page_number < printing::FIRST_PAGE_INDEX ||
+ page_number >= total_page_count_) {
return false;
- rendered_pages_[page_number] = false;
+ }
+ rendered_pages_[page_number].first = false;
+ rendered_pages_[page_number].second = i;
}
}
@@ -1029,14 +1072,15 @@ void PrintWebViewHelper::PrintPreviewContext::Abort() {
int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
DCHECK_EQ(RENDERING, state_);
- while (current_page_number_ < total_page_count_ &&
- rendered_pages_[current_page_number_]) {
- ++current_page_number_;
+ 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 (current_page_number_ == total_page_count_)
- return -1;
- rendered_pages_[current_page_number_] = true;
- return current_page_number_++;
+ if (rendered_pages_[current_page_number_].first)
+ return printing::INVALID_PAGE_INDEX;
+ rendered_pages_[current_page_number_].first = true;
+ return current_page_number_;
}
bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
@@ -1048,12 +1092,21 @@ bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
}
bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
+ // TODO(vandebo) I think this should only return false if the content is a
+ // PDF, just because we are printing a particular node does not mean it's
+ // a PDF (right?), we should check the mime type of the node.
if (node())
return false;
std::string mime(frame()->dataSource()->response().mimeType().utf8());
return mime != "application/pdf";
}
+int PrintWebViewHelper::PrintPreviewContext::GetPageSlotForPage(
+ int page_number) const {
+ int page_slot = rendered_pages_[page_number].second;
+ return page_slot == -1 ? page_number : page_slot;
+}
+
WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
return frame_;
}