| 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 df2270ff943ec7bfa3c088a4ff15261a83f0dbd1..6cd03b793d38593bc0ba6997fb939bcf316b8f21 100644
|
| --- a/chrome/renderer/print_web_view_helper.cc
|
| +++ b/chrome/renderer/print_web_view_helper.cc
|
| @@ -152,17 +152,11 @@ bool PrintingNodeOrPdfFrame(const WebFrame* frame, const WebNode& node) {
|
| return mime == "application/pdf";
|
| }
|
|
|
| -void SetMarginsForPdf(DictionaryValue* job_settings, bool force_no_margins) {
|
| - // TODO(vandebo) When it's plumbed through, check if the plugin wants us to
|
| - // scale or not. For now, assume the answer is yes.
|
| - if (force_no_margins) {
|
| - job_settings->SetInteger(printing::kSettingMarginsType,
|
| - printing::NO_MARGINS);
|
| - } else {
|
| - job_settings->SetInteger(printing::kSettingMarginsType,
|
| - printing::PRINTABLE_AREA_MARGINS);
|
| - }
|
| -
|
| +printing::MarginType GetMarginsForPdf(WebFrame* frame, const WebNode& node) {
|
| + if (frame->isPrintScalingDisabledForPlugin(node))
|
| + return printing::NO_MARGINS;
|
| + else
|
| + return printing::PRINTABLE_AREA_MARGINS;
|
| }
|
|
|
| // Get the (x, y) coordinate from where printing of the current text should
|
| @@ -444,7 +438,7 @@ PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
|
| : content::RenderViewObserver(render_view),
|
| content::RenderViewObserverTracker<PrintWebViewHelper>(render_view),
|
| print_web_view_(NULL),
|
| - is_preview_(switches::IsPrintPreviewEnabled()),
|
| + is_preview_enabled_(switches::IsPrintPreviewEnabled()),
|
| is_print_ready_metafile_sent_(false),
|
| user_cancelled_scripted_print_count_(0),
|
| notify_browser_of_print_failure_(true) {
|
| @@ -466,7 +460,7 @@ void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
|
| return;
|
| IncrementScriptedPrintCount();
|
|
|
| - if (is_preview_) {
|
| + if (is_preview_enabled_) {
|
| print_preview_context_.InitWithFrame(frame);
|
| RequestPrintPreview();
|
| } else {
|
| @@ -496,7 +490,7 @@ bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
|
|
|
| void PrintWebViewHelper::OnPrintForPrintPreview(
|
| const DictionaryValue& job_settings) {
|
| - DCHECK(is_preview_);
|
| + DCHECK(is_preview_enabled_);
|
| // If still not finished with earlier print request simply ignore.
|
| if (print_web_view_)
|
| return;
|
| @@ -517,7 +511,7 @@ void PrintWebViewHelper::OnPrintForPrintPreview(
|
| }
|
|
|
| WebFrame* pdf_frame = pdf_element.document().frame();
|
| - if (!UpdatePrintSettings(pdf_frame, pdf_element, job_settings, false)) {
|
| + if (!UpdatePrintSettings(pdf_frame, pdf_element, job_settings, true)) {
|
| LOG(ERROR) << "UpdatePrintSettings failed";
|
| DidFinishPrinting(FAIL_PRINT);
|
| return;
|
| @@ -567,11 +561,11 @@ void PrintWebViewHelper::OnPrintForSystemDialog() {
|
| }
|
|
|
| void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
|
| - DCHECK(is_preview_);
|
| + DCHECK(is_preview_enabled_);
|
| print_preview_context_.OnPrintPreview();
|
|
|
| if (!UpdatePrintSettings(print_preview_context_.frame(),
|
| - print_preview_context_.node(), settings, true)) {
|
| + print_preview_context_.node(), settings, false)) {
|
| if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) {
|
| Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings(
|
| routing_id(), print_pages_params_->params.document_cookie));
|
| @@ -716,7 +710,7 @@ void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
|
|
|
| // Make a copy of the node, in case RenderView::OnContextMenuClosed resets
|
| // its |context_menu_node_|.
|
| - if (is_preview_) {
|
| + if (is_preview_enabled_) {
|
| print_preview_context_.InitWithNode(context_menu_node);
|
| RequestPrintPreview();
|
| } else {
|
| @@ -726,7 +720,7 @@ void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
|
| }
|
|
|
| void PrintWebViewHelper::OnInitiatePrintPreview() {
|
| - DCHECK(is_preview_);
|
| + DCHECK(is_preview_enabled_);
|
| WebFrame* frame;
|
| if (GetPrintFrame(&frame)) {
|
| print_preview_context_.InitWithFrame(frame);
|
| @@ -765,7 +759,7 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
|
| }
|
|
|
| // Ask the browser to show UI to retrieve the final print settings.
|
| - if (!GetPrintSettingsFromUser(frame, expected_page_count,
|
| + if (!GetPrintSettingsFromUser(frame, node, expected_page_count,
|
| use_browser_overlays)) {
|
| DidFinishPrinting(OK); // Release resources and fail silently.
|
| return;
|
| @@ -789,7 +783,7 @@ void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
|
| Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
|
| }
|
| } else if (result == FAIL_PREVIEW) {
|
| - DCHECK(is_preview_);
|
| + DCHECK(is_preview_enabled_);
|
| store_print_pages_params = false;
|
| int cookie = print_pages_params_.get() ?
|
| print_pages_params_->params.document_cookie : 0;
|
| @@ -1045,24 +1039,50 @@ bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
|
|
|
| bool PrintWebViewHelper::UpdatePrintSettings(
|
| WebKit::WebFrame* frame, const WebKit::WebNode& node,
|
| - const DictionaryValue& passed_job_settings, bool generating_preview) {
|
| - DCHECK(is_preview_);
|
| + const DictionaryValue& passed_job_settings, bool print_for_preview) {
|
| + DCHECK(is_preview_enabled_);
|
| const DictionaryValue* job_settings = &passed_job_settings;
|
| DictionaryValue modified_job_settings;
|
| if (job_settings->empty()) {
|
| - if (generating_preview)
|
| + if (!print_for_preview)
|
| print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING);
|
| return false;
|
| }
|
|
|
| - bool is_pdf = PrintingNodeOrPdfFrame(frame, node);
|
| - if (is_pdf || !generating_preview) {
|
| - modified_job_settings.MergeDictionary(job_settings);
|
| - SetMarginsForPdf(&modified_job_settings, !generating_preview);
|
| - if (is_pdf) {
|
| - modified_job_settings.SetBoolean(printing::kSettingHeaderFooterEnabled,
|
| - false);
|
| + bool source_is_html = true;
|
| + if (print_for_preview) {
|
| + if (!job_settings->GetBoolean(printing::kSettingPreviewModifiable,
|
| + &source_is_html)) {
|
| + NOTREACHED();
|
| }
|
| + } else {
|
| + source_is_html = !PrintingNodeOrPdfFrame(frame, node);
|
| + }
|
| +
|
| + if (print_for_preview || !source_is_html) {
|
| + modified_job_settings.MergeDictionary(job_settings);
|
| + modified_job_settings.SetBoolean(printing::kSettingHeaderFooterEnabled,
|
| + false);
|
| +
|
| + // - On Windows, we don't add a margin until we turn it into an EMF when
|
| + // printing for print preview (We could add it in the plugin).
|
| + // - On Mac with Skia, we don't add a margin until we send it to the printer
|
| + // using the CG PDF class (We could add it in the plugin).
|
| + // - On Mac with CG, we can add a margin when generating the preview.
|
| + // - On Linux, we never add a margin (We Could add it in the plugin).
|
| +#if defined(OS_MACOSX) && !defined(USE_SKIA)
|
| + bool get_margins_from_pdf = !source_is_html && !print_for_preview;
|
| +#elif defined(OS_WIN) || defined(OS_MACOSX)
|
| + bool get_margins_from_pdf = !source_is_html && print_for_preview;
|
| +#else
|
| + bool get_margins_from_pdf = false;
|
| +#endif
|
| +
|
| + printing::MarginType margin_type = printing::NO_MARGINS;
|
| + if (get_margins_from_pdf)
|
| + margin_type = GetMarginsForPdf(frame, node);
|
| + modified_job_settings.SetInteger(printing::kSettingMarginsType,
|
| + margin_type);
|
| job_settings = &modified_job_settings;
|
| }
|
|
|
| @@ -1076,7 +1096,7 @@ bool PrintWebViewHelper::UpdatePrintSettings(
|
| print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
|
|
|
| if (PrintMsg_Print_Params_IsEmpty(settings.params)) {
|
| - if (generating_preview) {
|
| + if (!print_for_preview) {
|
| print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS);
|
| } else {
|
| WebKit::WebFrame* frame = print_preview_context_.frame();
|
| @@ -1098,7 +1118,7 @@ bool PrintWebViewHelper::UpdatePrintSettings(
|
| return false;
|
| }
|
|
|
| - if (generating_preview) {
|
| + if (!print_for_preview) {
|
| // Validate expected print preview settings.
|
| if (!job_settings->GetString(printing::kPreviewUIAddr,
|
| &(settings.params.preview_ui_addr)) ||
|
| @@ -1140,6 +1160,7 @@ bool PrintWebViewHelper::UpdatePrintSettings(
|
| }
|
|
|
| bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame,
|
| + const WebKit::WebNode& node,
|
| int expected_pages_count,
|
| bool use_browser_overlays) {
|
| PrintHostMsg_ScriptedPrint_Params params;
|
| @@ -1156,7 +1177,10 @@ bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame,
|
| params.cookie = print_pages_params_->params.document_cookie;
|
| params.has_selection = frame->hasSelection();
|
| params.expected_pages_count = expected_pages_count;
|
| - params.margin_type = printing::DEFAULT_MARGINS;
|
| + printing::MarginType margin_type = printing::DEFAULT_MARGINS;
|
| + if (PrintingNodeOrPdfFrame(frame, node))
|
| + margin_type = GetMarginsForPdf(frame, node);
|
| + params.margin_type = margin_type;
|
|
|
| Send(new PrintHostMsg_DidShowPrintDialog(routing_id()));
|
|
|
| @@ -1331,6 +1355,7 @@ PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
|
| void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
|
| WebKit::WebFrame* web_frame) {
|
| DCHECK(web_frame);
|
| + DCHECK(!IsRendering());
|
| state_ = INITIALIZED;
|
| frame_ = web_frame;
|
| node_.reset();
|
| @@ -1339,20 +1364,21 @@ void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
|
| void PrintWebViewHelper::PrintPreviewContext::InitWithNode(
|
| const WebKit::WebNode& web_node) {
|
| DCHECK(!web_node.isNull());
|
| + DCHECK(!IsRendering());
|
| state_ = INITIALIZED;
|
| frame_ = web_node.document().frame();
|
| node_ = web_node;
|
| }
|
|
|
| void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
|
| - DCHECK(IsReadyToRender());
|
| + DCHECK_EQ(INITIALIZED, state_);
|
| ClearContext();
|
| }
|
|
|
| bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
|
| PrintMsg_Print_Params* print_params,
|
| const std::vector<int>& pages) {
|
| - DCHECK(IsReadyToRender());
|
| + DCHECK_EQ(INITIALIZED, state_);
|
| state_ = RENDERING;
|
|
|
| print_params_.reset(new PrintMsg_Print_Params(*print_params));
|
| @@ -1418,8 +1444,7 @@ void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() {
|
| }
|
|
|
| void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() {
|
| - if (state_ != DONE && state_ != RENDERING)
|
| - NOTREACHED();
|
| + DCHECK(IsRendering());
|
|
|
| base::TimeTicks begin_time = base::TimeTicks::Now();
|
| metafile_->FinishDocument();
|
| @@ -1441,6 +1466,7 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() {
|
|
|
| void PrintWebViewHelper::PrintPreviewContext::Finished() {
|
| DCHECK_EQ(DONE, state_);
|
| + state_ = INITIALIZED;
|
| ClearContext();
|
| }
|
|
|
| @@ -1462,8 +1488,8 @@ int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
|
| return pages_to_render_[current_page_index_++];
|
| }
|
|
|
| -bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
|
| - return state_ != UNINITIALIZED;
|
| +bool PrintWebViewHelper::PrintPreviewContext::IsRendering() const {
|
| + return state_ == RENDERING || state_ == DONE;
|
| }
|
|
|
| bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
|
| @@ -1473,15 +1499,18 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
|
|
|
| bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile()
|
| const {
|
| + DCHECK(IsRendering());
|
| return current_page_index_ == print_ready_metafile_page_count_;
|
| }
|
|
|
| bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const {
|
| + DCHECK(IsRendering());
|
| return static_cast<size_t>(current_page_index_) == pages_to_render_.size();
|
| }
|
|
|
| void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages(
|
| bool generate_draft_pages) {
|
| + DCHECK_EQ(INITIALIZED, state_);
|
| generate_draft_pages_ = generate_draft_pages;
|
| }
|
|
|
| @@ -1495,11 +1524,12 @@ WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
|
| }
|
|
|
| const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const {
|
| + DCHECK(state_ != UNINITIALIZED);
|
| return node_;
|
| }
|
|
|
| int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
|
| - DCHECK(IsReadyToRender());
|
| + DCHECK(IsRendering());
|
| return total_page_count_;
|
| }
|
|
|
| @@ -1509,11 +1539,13 @@ bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() {
|
|
|
| printing::PreviewMetafile*
|
| PrintWebViewHelper::PrintPreviewContext::metafile() const {
|
| + DCHECK(IsRendering());
|
| return metafile_.get();
|
| }
|
|
|
| const PrintMsg_Print_Params&
|
| PrintWebViewHelper::PrintPreviewContext::print_params() const {
|
| + DCHECK(state_ != UNINITIALIZED);
|
| return *print_params_;
|
| }
|
|
|
| @@ -1523,6 +1555,7 @@ int PrintWebViewHelper::PrintPreviewContext::last_error() const {
|
|
|
| const gfx::Size&
|
| PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
|
| + DCHECK(IsRendering());
|
| return prep_frame_view_->GetPrintCanvasSize();
|
| }
|
|
|
|
|