Index: chrome/renderer/print_web_view_helper.cc |
=================================================================== |
--- chrome/renderer/print_web_view_helper.cc (revision 98330) |
+++ chrome/renderer/print_web_view_helper.cc (working copy) |
@@ -9,7 +9,6 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/metrics/histogram.h" |
-#include "base/process_util.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/print_messages.h" |
@@ -33,6 +32,7 @@ |
#include "ui/base/l10n/l10n_util.h" |
#if defined(OS_POSIX) |
+#include "base/process_util.h" |
#include "content/common/view_messages.h" |
#endif |
@@ -218,8 +218,6 @@ |
IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, |
ResetScriptedPrintCount) |
- IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, OnContinuePreview) |
- IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, OnAbortPreview) |
IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
DisplayPrintJobError) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -256,7 +254,7 @@ |
return; |
} |
- if (!UpdatePrintSettings(job_settings)) { |
+ if (!UpdatePrintSettings(job_settings, false)) { |
DidFinishPrinting(FAIL_PRINT); |
return; |
} |
@@ -314,7 +312,7 @@ |
return; |
} |
- if (!UpdatePrintSettings(settings)) { |
+ if (!UpdatePrintSettings(settings, true)) { |
DidFinishPrinting(FAIL_PREVIEW); |
return; |
} |
@@ -342,7 +340,9 @@ |
// PDF printer device supports alpha blending. |
print_pages_params_->params.supports_alpha_blend = true; |
- if (!CreatePreviewDocument()) |
+ if (CreatePreviewDocument()) |
+ DidFinishPrinting(OK); |
+ else |
DidFinishPrinting(FAIL_PREVIEW); |
} |
@@ -357,44 +357,24 @@ |
params.document_cookie = print_pages_params_->params.document_cookie; |
params.preview_request_id = print_pages_params_->params.preview_request_id; |
Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); |
- PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); |
- return true; |
-} |
+ if (CheckForCancel()) |
+ return false; |
-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(); |
- } |
+ while ((page_number = print_preview_context_.GetNextPageNumber()) >= 0) { |
+ if (!RenderPreviewPage(page_number)) |
+ return false; |
+ if (CheckForCancel()) |
+ return false; |
+ }; |
- if (page_number >= printing::FIRST_PAGE_INDEX) { |
- // Continue generating the print preview. |
- RenderPreviewPage(page_number); |
- return; |
- } |
- |
// Finished generating preview. Finalize the document. |
- if (FinalizePreviewDocument()) { |
- print_preview_context_.Finished(); |
- DidFinishPrinting(OK); |
- } else { |
- DidFinishPrinting(FAIL_PREVIEW); |
- } |
+ if (!FinalizePreviewDocument()) |
+ return false; |
+ print_preview_context_.Finished(); |
+ return true; |
} |
-void PrintWebViewHelper::OnAbortPreview() { |
- DidFinishPrinting(ABORT_PREVIEW); |
- return; |
-} |
- |
bool PrintWebViewHelper::FinalizePreviewDocument() { |
print_preview_context_.FinalizePreviewDocument(); |
@@ -507,12 +487,11 @@ |
DCHECK(is_preview_); |
store_print_pages_params = false; |
int cookie = print_pages_params_->params.document_cookie; |
- Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
+ if (notify_browser_of_print_failure_) |
+ Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
+ else |
+ Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); |
print_preview_context_.Failed(); |
- } else if (result == ABORT_PREVIEW) { |
- DCHECK(is_preview_); |
- store_print_pages_params = false; |
- print_preview_context_.Abort(); |
} |
if (print_web_view_) { |
@@ -750,33 +729,26 @@ |
return true; |
} |
-bool PrintWebViewHelper::UpdatePrintSettingsRequestId( |
- const DictionaryValue& job_settings, |
- PrintMsg_Print_Params* params) { |
- if (!job_settings.GetInteger(printing::kPreviewRequestID, |
- &(params->preview_request_id))) { |
- NOTREACHED(); |
- return false; |
- } |
- return true; |
-} |
- |
bool PrintWebViewHelper::UpdatePrintSettings( |
- const DictionaryValue& job_settings) { |
+ const DictionaryValue& job_settings, bool is_preview) { |
PrintMsg_PrintPages_Params settings; |
Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), |
print_pages_params_->params.document_cookie, job_settings, &settings)); |
- |
if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) |
return false; |
- if (!UpdatePrintSettingsRequestId(job_settings, &(settings.params))) |
- return false; |
- |
- if (!job_settings.GetBoolean(printing::kIsFirstRequest, |
- &(settings.params.is_first_request))) { |
- NOTREACHED(); |
+ if (is_preview) { |
+ // Validate expected print preview settings. |
+ if (!job_settings.GetString(printing::kPreviewUIAddr, |
+ &(settings.params.preview_ui_addr)) || |
+ !job_settings.GetInteger(printing::kPreviewRequestID, |
+ &(settings.params.preview_request_id)) || |
+ !job_settings.GetBoolean(printing::kIsFirstRequest, |
+ &(settings.params.is_first_request))) { |
+ NOTREACHED(); |
+ return false; |
+ } |
} |
print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); |
@@ -875,9 +847,6 @@ |
} |
} |
- if (!too_frequent && print_preview_context_.IsBusy()) |
- too_frequent = true; |
- |
if (!too_frequent) |
return false; |
@@ -913,40 +882,57 @@ |
Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
} |
-void PrintWebViewHelper::PreviewPageRendered(int page_number, |
+bool PrintWebViewHelper::CheckForCancel() { |
+ bool cancel = false; |
+ Send(new PrintHostMsg_CheckForCancel( |
+ routing_id(), |
+ print_pages_params_->params.preview_ui_addr, |
+ print_pages_params_->params.preview_request_id, |
+ &cancel)); |
+ if (cancel) |
+ notify_browser_of_print_failure_ = false; |
+ return cancel; |
+} |
+ |
+bool 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())) { |
+ 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()) { |
+ DCHECK(!metafile); |
+ return true; |
+ } |
+ |
+ if (!metafile) { |
NOTREACHED(); |
- DidFinishPrinting(FAIL_PREVIEW); |
- return; |
+ return false; |
} |
- 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; |
- } |
+ uint32 buf_size = metafile->GetDataSize(); |
+ DCHECK_GT(buf_size, 0u); |
+ if (!CopyMetafileDataToSharedMem( |
+ metafile, &(preview_page_params.metafile_data_handle))) { |
+ return false; |
} |
+ |
preview_page_params.data_size = buf_size; |
preview_page_params.page_number = page_number; |
preview_page_params.preview_request_id = |
print_pages_params_->params.preview_request_id; |
+ |
Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); |
+ return true; |
} |
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
: frame_(NULL), |
total_page_count_(0), |
actual_page_count_(0), |
- current_page_number_(0), |
+ current_page_index_(0), |
state_(UNINITIALIZED) { |
} |
@@ -956,8 +942,6 @@ |
void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( |
WebKit::WebFrame* web_frame) { |
DCHECK(web_frame); |
- if (IsReadyToRender()) |
- return; |
state_ = INITIALIZED; |
frame_ = web_frame; |
node_.reset(); |
@@ -966,8 +950,6 @@ |
void PrintWebViewHelper::PrintPreviewContext::InitWithNode( |
const WebKit::WebNode& web_node) { |
DCHECK(!web_node.isNull()); |
- if (IsReadyToRender()) |
- return; |
state_ = INITIALIZED; |
frame_ = web_node.document().frame(); |
node_.reset(new WebNode(web_node)); |
@@ -1000,23 +982,20 @@ |
if (total_page_count_ == 0) |
return false; |
- current_page_number_ = 0; |
+ current_page_index_ = 0; |
if (pages.empty()) { |
actual_page_count_ = total_page_count_; |
- rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, |
- std::make_pair(false, -1)); |
+ for (int i = 0; i < actual_page_count_; ++i) |
+ pages_to_render_.push_back(i); |
} 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; |
+ pages_to_render_.push_back(page_number); |
} |
} |
@@ -1063,39 +1042,22 @@ |
} |
void PrintWebViewHelper::PrintPreviewContext::Failed() { |
- DCHECK(IsBusy()); |
+ DCHECK(state_ == INITIALIZED || state_ == RENDERING); |
state_ = INITIALIZED; |
ClearContext(); |
} |
-void PrintWebViewHelper::PrintPreviewContext::Abort() { |
- state_ = UNINITIALIZED; |
- ClearContext(); |
- frame_ = NULL; |
- node_.reset(); |
-} |
- |
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) |
- return printing::INVALID_PAGE_INDEX; |
- rendered_pages_[current_page_number_].first = true; |
- return current_page_number_; |
+ if (current_page_index_ >= actual_page_count_) |
+ return -1; |
+ return pages_to_render_[current_page_index_++]; |
} |
bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { |
return state_ != UNINITIALIZED; |
} |
-bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { |
- return state_ == INITIALIZED || state_ == RENDERING; |
-} |
- |
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 |
@@ -1115,6 +1077,7 @@ |
} |
int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
+ DCHECK(IsReadyToRender()); |
return total_page_count_; |
} |
@@ -1135,5 +1098,5 @@ |
void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
prep_frame_view_.reset(); |
metafile_.reset(); |
- rendered_pages_.clear(); |
+ pages_to_render_.clear(); |
} |