diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 2 | ||||
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.cc | 9 | ||||
-rw-r--r-- | chrome/browser/printing/printing_message_filter.cc | 35 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/print_preview.js | 2 | ||||
-rw-r--r-- | chrome/renderer/mock_printer.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 89 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 8 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_browsertest.cc | 2 | ||||
-rw-r--r-- | printing/print_settings_initializer_win.cc | 4 | ||||
-rw-r--r-- | printing/printing_context_cairo.cc | 5 |
10 files changed, 107 insertions, 54 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index bec5664..c766943 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6007,7 +6007,7 @@ Keep your key file in a safe place. You will need it to create new versions of y Print preview failed. </message> <message name="IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS" desc="Message to display when selected printer is not reachable or its settings are invalid."> - The selected printer is not available or not installed correctly. Check your printer or try select another printer. + The selected printer is not available or not installed correctly. Check your printer or try selecting another printer. </message> <message name="IDS_PRINT_PREVIEW_INITIATOR_TAB_CRASHED" desc="Error message displayed when print preview fails because the tab that initiated the print preview crashed."> Print is unavailable because the page you were trying to print has crashed. diff --git a/chrome/browser/printing/print_dialog_gtk.cc b/chrome/browser/printing/print_dialog_gtk.cc index ccdd07b..afe6d67 100644 --- a/chrome/browser/printing/print_dialog_gtk.cc +++ b/chrome/browser/printing/print_dialog_gtk.cc @@ -175,6 +175,9 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings, return false; } + if (!gtk_settings_) + gtk_settings_ = gtk_print_settings_new(); + if (!print_to_pdf) { scoped_ptr<GtkPrinterList> printer_list(new GtkPrinterList); printer_ = printer_list->GetPrinterWithName(device_name.c_str()); @@ -182,7 +185,13 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings, g_object_ref(printer_); gtk_print_settings_set_printer(gtk_settings_, gtk_printer_get_name(printer_)); + if (!page_setup_) { + page_setup_ = gtk_printer_get_default_page_size(printer_); + } } + if (!page_setup_) + page_setup_ = gtk_page_setup_new(); + gtk_print_settings_set_n_copies(gtk_settings_, copies); gtk_print_settings_set_collate(gtk_settings_, collate); diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc index f0b8a65..98bcc6f 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -288,22 +288,29 @@ void PrintingMessageFilter::OnUpdatePrintSettings( int document_cookie, const DictionaryValue& job_settings, IPC::Message* reply_msg) { scoped_refptr<printing::PrinterQuery> printer_query; - print_job_manager_->PopPrinterQuery(document_cookie, &printer_query); - if (printer_query.get()) { - CancelableTask* task = NewRunnableMethod( - this, - &PrintingMessageFilter::OnUpdatePrintSettingsReply, - printer_query, - reply_msg); - printer_query->SetSettings(job_settings, task); + if (!print_job_manager_->printing_enabled()) { + // Reply with NULL query. + OnUpdatePrintSettingsReply(printer_query, reply_msg); + return; } + + print_job_manager_->PopPrinterQuery(document_cookie, &printer_query); + if (!printer_query.get()) + printer_query = new printing::PrinterQuery; + CancelableTask* task = NewRunnableMethod( + this, + &PrintingMessageFilter::OnUpdatePrintSettingsReply, + printer_query, + reply_msg); + printer_query->SetSettings(job_settings, task); } void PrintingMessageFilter::OnUpdatePrintSettingsReply( scoped_refptr<printing::PrinterQuery> printer_query, IPC::Message* reply_msg) { PrintMsg_PrintPages_Params params; - if (printer_query->last_status() != printing::PrintingContext::OK) { + if (!printer_query.get() || + printer_query->last_status() != printing::PrintingContext::OK) { params.Reset(); } else { RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); @@ -314,10 +321,12 @@ void PrintingMessageFilter::OnUpdatePrintSettingsReply( PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params); Send(reply_msg); // If user hasn't cancelled. - if (printer_query->cookie() && printer_query->settings().dpi()) - print_job_manager_->QueuePrinterQuery(printer_query.get()); - else - printer_query->StopWorker(); + if (printer_query.get()) { + if (printer_query->cookie() && printer_query->settings().dpi()) + print_job_manager_->QueuePrinterQuery(printer_query.get()); + else + printer_query->StopWorker(); + } } void PrintingMessageFilter::OnCheckForCancel(const std::string& preview_ui_addr, diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js index 232c2bf..9232850 100644 --- a/chrome/browser/resources/print_preview/print_preview.js +++ b/chrome/browser/resources/print_preview/print_preview.js @@ -853,7 +853,7 @@ function printPreviewFailed() { /** * Display an error message when encountered invalid printer settings. - * Called from PrintPreviewMessageHandler::OnInvalidDefaultPrinter(). + * Called from PrintPreviewMessageHandler::OnInvalidPrinterSettings(). */ function invalidPrinterSettings() { displayErrorMessage(localStrings.getString('invalidPrinterSettings')); diff --git a/chrome/renderer/mock_printer.cc b/chrome/renderer/mock_printer.cc index 9a5d2f4..869e742a 100644 --- a/chrome/renderer/mock_printer.cc +++ b/chrome/renderer/mock_printer.cc @@ -123,8 +123,9 @@ void MockPrinter::ScriptedPrint(int cookie, void MockPrinter::UpdateSettings(int cookie, PrintMsg_PrintPages_Params* params, const std::vector<int>& pages) { - EXPECT_EQ(document_cookie_, cookie); - + if (document_cookie_ == -1) { + document_cookie_ = CreateDocumentCookie(); + } params->Reset(); params->pages = pages; SetPrintParams(&(params->params)); diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index 784fc10..65920f7 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -567,19 +567,19 @@ void PrintWebViewHelper::OnPrintForPrintPreview( return; } - WebFrame* pdf_frame = pdf_element.document().frame(); - scoped_ptr<PrepareFrameAndViewForPrint> prepare; - if (!InitPrintSettingsAndPrepareFrame(pdf_frame, &pdf_element, &prepare)) { - LOG(ERROR) << "Failed to initialize print page settings"; - return; - } - if (!UpdatePrintSettings(job_settings, false)) { LOG(ERROR) << "UpdatePrintSettings failed"; DidFinishPrinting(FAIL_PRINT); return; } + WebFrame* pdf_frame = pdf_element.document().frame(); + scoped_ptr<PrepareFrameAndViewForPrint> prepare; + prepare.reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, + pdf_frame, &pdf_element)); + UpdatePrintableSizeInPrintParameters(pdf_frame, &pdf_element, prepare.get(), + &print_pages_params_->params); + // Render Pages for printing. if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) { LOG(ERROR) << "RenderPagesForPrint failed"; @@ -629,17 +629,12 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { DCHECK(is_preview_); print_preview_context_.OnPrintPreview(); - if (!InitPrintSettings(print_preview_context_.frame(), - print_preview_context_.node(), - true)) { - Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( - routing_id(), - print_pages_params_->params.document_cookie)); - return; - } - if (!UpdatePrintSettings(settings, true)) { - LOG(ERROR) << "UpdatePrintSettings failed"; + if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { + Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( + routing_id(), print_pages_params_->params.document_cookie)); + notify_browser_of_print_failure_ = false; // Already sent. + } DidFinishPrinting(FAIL_PREVIEW); return; } @@ -804,8 +799,10 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { // Initialize print settings. scoped_ptr<PrepareFrameAndViewForPrint> prepare; - if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) + if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) { + DidFinishPrinting(FAIL_PRINT); return; // Failed to init print page settings. + } int expected_page_count = 0; bool use_browser_overlays = true; @@ -851,7 +848,8 @@ void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { } else if (result == FAIL_PREVIEW) { DCHECK(is_preview_); store_print_pages_params = false; - int cookie = print_pages_params_->params.document_cookie; + int cookie = print_pages_params_.get() ? + print_pages_params_->params.document_cookie : 0; if (notify_browser_of_print_failure_) Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); else @@ -1054,9 +1052,7 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( prepare->UpdatePrintParams(*params); } -bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, - WebKit::WebNode* node, - bool is_preview) { +bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame) { DCHECK(frame); PrintMsg_PrintPages_Params settings; @@ -1067,12 +1063,10 @@ bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, // terminate. bool result = true; if (PrintMsg_Print_Params_IsEmpty(settings.params)) { - if (!is_preview) { - render_view()->runModalAlertDialog( - frame, - l10n_util::GetStringUTF16( - IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS)); - } + render_view()->runModalAlertDialog( + frame, + l10n_util::GetStringUTF16( + IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS)); result = false; } @@ -1091,7 +1085,7 @@ bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( WebKit::WebFrame* frame, WebKit::WebNode* node, scoped_ptr<PrepareFrameAndViewForPrint>* prepare) { - if (!InitPrintSettings(frame, node, false)) + if (!InitPrintSettings(frame)) return false; DCHECK(!prepare->get()); @@ -1106,10 +1100,39 @@ bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( bool PrintWebViewHelper::UpdatePrintSettings( const DictionaryValue& job_settings, bool is_preview) { - PrintMsg_PrintPages_Params settings; + if (job_settings.empty()) { + if (is_preview) + print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); + return false; + } + // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when + // possible. + int cookie = print_pages_params_.get() ? + print_pages_params_->params.document_cookie : 0; + PrintMsg_PrintPages_Params settings; Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), - print_pages_params_->params.document_cookie, job_settings, &settings)); + cookie, job_settings, &settings)); + print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); + + if (PrintMsg_Print_Params_IsEmpty(settings.params)) { + if (is_preview) { + print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); + } else { + WebKit::WebFrame* frame = print_preview_context_.frame(); + if (!frame) { + GetPrintFrame(&frame); + } + if (frame) { + render_view()->runModalAlertDialog( + frame, + l10n_util::GetStringUTF16( + IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS)); + } + } + return false; + } + if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) { print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS); return false; @@ -1545,6 +1568,10 @@ PrintWebViewHelper::PrintPreviewContext::print_params() const { return *print_params_; } +int PrintWebViewHelper::PrintPreviewContext::last_error() const { + return error_; +} + const gfx::Size& PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { return prep_frame_view_->GetPrintCanvasSize(); diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h index 82d5e03..b1244f3 100644 --- a/chrome/renderer/print_web_view_helper.h +++ b/chrome/renderer/print_web_view_helper.h @@ -172,13 +172,13 @@ class PrintWebViewHelper : public RenderViewObserver, // Print Settings ----------------------------------------------------------- // Initialize print page settings with default settings. - bool InitPrintSettings(WebKit::WebFrame* frame, - WebKit::WebNode* node, - bool is_preview); + // Used only for native printing workflow. + bool InitPrintSettings(WebKit::WebFrame* frame); // Initialize print page settings with default settings and prepare the frame // for print. A new PrepareFrameAndViewForPrint is created to fulfill the // request and is filled into the |prepare| argument. + // Used only for native printing workflow. bool InitPrintSettingsAndPrepareFrame( WebKit::WebFrame* frame, WebKit::WebNode* node, @@ -334,6 +334,7 @@ class PrintWebViewHelper : public RenderViewObserver, PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED, PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE, PREVIEW_ERROR_UPDATING_PRINT_SETTINGS, + PREVIEW_ERROR_INVALID_PRINTER_SETTINGS, PREVIEW_ERROR_LAST_ENUM // Always last. }; @@ -390,6 +391,7 @@ class PrintWebViewHelper : public RenderViewObserver, printing::PreviewMetafile* metafile() const; const PrintMsg_Print_Params& print_params() const; const gfx::Size& GetPrintCanvasSize() const; + int last_error() const; private: enum State { diff --git a/chrome/renderer/print_web_view_helper_browsertest.cc b/chrome/renderer/print_web_view_helper_browsertest.cc index de9d016..e7feba4 100644 --- a/chrome/renderer/print_web_view_helper_browsertest.cc +++ b/chrome/renderer/print_web_view_helper_browsertest.cc @@ -489,7 +489,6 @@ TEST_F(PrintWebViewHelperPreviewTest, OnPrintForPrintPreviewFail) { DictionaryValue empty_dict; PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(empty_dict); - VerifyPrintFailed(true); VerifyPagesPrinted(false); } @@ -530,6 +529,7 @@ TEST_F(PrintWebViewHelperPreviewTest, CreatePrintSettingsDictionary(&dict); PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(dict); + VerifyPrintFailed(true); VerifyPagesPrinted(false); } diff --git a/printing/print_settings_initializer_win.cc b/printing/print_settings_initializer_win.cc index 065a8db..0f6a930 100644 --- a/printing/print_settings_initializer_win.cc +++ b/printing/print_settings_initializer_win.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -23,7 +23,7 @@ void PrintSettingsInitializerWin::InitPrintSettings( print_settings->set_printer_name(dev_mode.dmDeviceName); print_settings->set_device_name(new_device_name); - print_settings->ranges = new_ranges; + print_settings->ranges = const_cast<PageRanges&>(new_ranges); print_settings->set_landscape(dev_mode.dmOrientation == DMORIENT_LANDSCAPE); print_settings->selection_only = print_selection_only; diff --git a/printing/printing_context_cairo.cc b/printing/printing_context_cairo.cc index 16eb837..c4a7105 100644 --- a/printing/printing_context_cairo.cc +++ b/printing/printing_context_cairo.cc @@ -155,6 +155,11 @@ PrintingContext::Result PrintingContextCairo::UpdatePrinterSettings( #else DCHECK(!in_print_job_); + if (!print_dialog_) { + print_dialog_ = create_dialog_func_(this); + print_dialog_->AddRefToDialog(); + } + if (!print_dialog_->UpdateSettings(job_settings, ranges)) return OnError(); |