summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd2
-rw-r--r--chrome/browser/printing/print_dialog_gtk.cc9
-rw-r--r--chrome/browser/printing/printing_message_filter.cc35
-rw-r--r--chrome/browser/resources/print_preview/print_preview.js2
-rw-r--r--chrome/renderer/mock_printer.cc5
-rw-r--r--chrome/renderer/print_web_view_helper.cc89
-rw-r--r--chrome/renderer/print_web_view_helper.h8
-rw-r--r--chrome/renderer/print_web_view_helper_browsertest.cc2
-rw-r--r--printing/print_settings_initializer_win.cc4
-rw-r--r--printing/printing_context_cairo.cc5
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(), &params.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();