0

Fix print preview workflow to reflect settings of selected printer.

BUG=95110
TEST=none


Review URL: http://codereview.chromium.org/7831041

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102242 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
arthurhsu@chromium.org
2011-09-22 05:31:00 +00:00
parent 19cc5b4680
commit c7a90019bf
10 changed files with 107 additions and 54 deletions

@ -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. Print preview failed.
</message> </message>
<message name="IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS" desc="Message to display when selected printer is not reachable or its settings are invalid."> <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>
<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."> <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. Print is unavailable because the page you were trying to print has crashed.

@ -175,6 +175,9 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings,
return false; return false;
} }
if (!gtk_settings_)
gtk_settings_ = gtk_print_settings_new();
if (!print_to_pdf) { if (!print_to_pdf) {
scoped_ptr<GtkPrinterList> printer_list(new GtkPrinterList); scoped_ptr<GtkPrinterList> printer_list(new GtkPrinterList);
printer_ = printer_list->GetPrinterWithName(device_name.c_str()); printer_ = printer_list->GetPrinterWithName(device_name.c_str());
@ -182,7 +185,13 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings,
g_object_ref(printer_); g_object_ref(printer_);
gtk_print_settings_set_printer(gtk_settings_, gtk_print_settings_set_printer(gtk_settings_,
gtk_printer_get_name(printer_)); 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_n_copies(gtk_settings_, copies);
gtk_print_settings_set_collate(gtk_settings_, collate); gtk_print_settings_set_collate(gtk_settings_, collate);

@ -288,22 +288,29 @@ void PrintingMessageFilter::OnUpdatePrintSettings(
int document_cookie, const DictionaryValue& job_settings, int document_cookie, const DictionaryValue& job_settings,
IPC::Message* reply_msg) { IPC::Message* reply_msg) {
scoped_refptr<printing::PrinterQuery> printer_query; scoped_refptr<printing::PrinterQuery> printer_query;
print_job_manager_->PopPrinterQuery(document_cookie, &printer_query); if (!print_job_manager_->printing_enabled()) {
if (printer_query.get()) { // Reply with NULL query.
CancelableTask* task = NewRunnableMethod( OnUpdatePrintSettingsReply(printer_query, reply_msg);
this, return;
&PrintingMessageFilter::OnUpdatePrintSettingsReply,
printer_query,
reply_msg);
printer_query->SetSettings(job_settings, task);
} }
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( void PrintingMessageFilter::OnUpdatePrintSettingsReply(
scoped_refptr<printing::PrinterQuery> printer_query, scoped_refptr<printing::PrinterQuery> printer_query,
IPC::Message* reply_msg) { IPC::Message* reply_msg) {
PrintMsg_PrintPages_Params params; 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(); params.Reset();
} else { } else {
RenderParamsFromPrintSettings(printer_query->settings(), &params.params); RenderParamsFromPrintSettings(printer_query->settings(), &params.params);
@ -314,10 +321,12 @@ void PrintingMessageFilter::OnUpdatePrintSettingsReply(
PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params); PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params);
Send(reply_msg); Send(reply_msg);
// If user hasn't cancelled. // If user hasn't cancelled.
if (printer_query->cookie() && printer_query->settings().dpi()) if (printer_query.get()) {
print_job_manager_->QueuePrinterQuery(printer_query.get()); if (printer_query->cookie() && printer_query->settings().dpi())
else print_job_manager_->QueuePrinterQuery(printer_query.get());
printer_query->StopWorker(); else
printer_query->StopWorker();
}
} }
void PrintingMessageFilter::OnCheckForCancel(const std::string& preview_ui_addr, void PrintingMessageFilter::OnCheckForCancel(const std::string& preview_ui_addr,

@ -853,7 +853,7 @@ function printPreviewFailed() {
/** /**
* Display an error message when encountered invalid printer settings. * Display an error message when encountered invalid printer settings.
* Called from PrintPreviewMessageHandler::OnInvalidDefaultPrinter(). * Called from PrintPreviewMessageHandler::OnInvalidPrinterSettings().
*/ */
function invalidPrinterSettings() { function invalidPrinterSettings() {
displayErrorMessage(localStrings.getString('invalidPrinterSettings')); displayErrorMessage(localStrings.getString('invalidPrinterSettings'));

@ -123,8 +123,9 @@ void MockPrinter::ScriptedPrint(int cookie,
void MockPrinter::UpdateSettings(int cookie, void MockPrinter::UpdateSettings(int cookie,
PrintMsg_PrintPages_Params* params, PrintMsg_PrintPages_Params* params,
const std::vector<int>& pages) { const std::vector<int>& pages) {
EXPECT_EQ(document_cookie_, cookie); if (document_cookie_ == -1) {
document_cookie_ = CreateDocumentCookie();
}
params->Reset(); params->Reset();
params->pages = pages; params->pages = pages;
SetPrintParams(&(params->params)); SetPrintParams(&(params->params));

@ -567,19 +567,19 @@ void PrintWebViewHelper::OnPrintForPrintPreview(
return; 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)) { if (!UpdatePrintSettings(job_settings, false)) {
LOG(ERROR) << "UpdatePrintSettings failed"; LOG(ERROR) << "UpdatePrintSettings failed";
DidFinishPrinting(FAIL_PRINT); DidFinishPrinting(FAIL_PRINT);
return; 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. // Render Pages for printing.
if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) { if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) {
LOG(ERROR) << "RenderPagesForPrint failed"; LOG(ERROR) << "RenderPagesForPrint failed";
@ -629,17 +629,12 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
DCHECK(is_preview_); DCHECK(is_preview_);
print_preview_context_.OnPrintPreview(); 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)) { 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); DidFinishPrinting(FAIL_PREVIEW);
return; return;
} }
@ -804,8 +799,10 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) {
// Initialize print settings. // Initialize print settings.
scoped_ptr<PrepareFrameAndViewForPrint> prepare; scoped_ptr<PrepareFrameAndViewForPrint> prepare;
if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) {
DidFinishPrinting(FAIL_PRINT);
return; // Failed to init print page settings. return; // Failed to init print page settings.
}
int expected_page_count = 0; int expected_page_count = 0;
bool use_browser_overlays = true; bool use_browser_overlays = true;
@ -851,7 +848,8 @@ void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
} else if (result == FAIL_PREVIEW) { } else if (result == FAIL_PREVIEW) {
DCHECK(is_preview_); DCHECK(is_preview_);
store_print_pages_params = false; 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_) if (notify_browser_of_print_failure_)
Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
else else
@ -1054,9 +1052,7 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
prepare->UpdatePrintParams(*params); prepare->UpdatePrintParams(*params);
} }
bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame) {
WebKit::WebNode* node,
bool is_preview) {
DCHECK(frame); DCHECK(frame);
PrintMsg_PrintPages_Params settings; PrintMsg_PrintPages_Params settings;
@ -1067,12 +1063,10 @@ bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame,
// terminate. // terminate.
bool result = true; bool result = true;
if (PrintMsg_Print_Params_IsEmpty(settings.params)) { if (PrintMsg_Print_Params_IsEmpty(settings.params)) {
if (!is_preview) { render_view()->runModalAlertDialog(
render_view()->runModalAlertDialog( frame,
frame, l10n_util::GetStringUTF16(
l10n_util::GetStringUTF16( IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS));
IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS));
}
result = false; result = false;
} }
@ -1091,7 +1085,7 @@ bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame,
bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
WebKit::WebFrame* frame, WebKit::WebNode* node, WebKit::WebFrame* frame, WebKit::WebNode* node,
scoped_ptr<PrepareFrameAndViewForPrint>* prepare) { scoped_ptr<PrepareFrameAndViewForPrint>* prepare) {
if (!InitPrintSettings(frame, node, false)) if (!InitPrintSettings(frame))
return false; return false;
DCHECK(!prepare->get()); DCHECK(!prepare->get());
@ -1106,10 +1100,39 @@ bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
bool PrintWebViewHelper::UpdatePrintSettings( bool PrintWebViewHelper::UpdatePrintSettings(
const DictionaryValue& job_settings, bool is_preview) { 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(), 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) { if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) {
print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS); print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS);
return false; return false;
@ -1545,6 +1568,10 @@ PrintWebViewHelper::PrintPreviewContext::print_params() const {
return *print_params_; return *print_params_;
} }
int PrintWebViewHelper::PrintPreviewContext::last_error() const {
return error_;
}
const gfx::Size& const gfx::Size&
PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
return prep_frame_view_->GetPrintCanvasSize(); return prep_frame_view_->GetPrintCanvasSize();

@ -172,13 +172,13 @@ class PrintWebViewHelper : public RenderViewObserver,
// Print Settings ----------------------------------------------------------- // Print Settings -----------------------------------------------------------
// Initialize print page settings with default settings. // Initialize print page settings with default settings.
bool InitPrintSettings(WebKit::WebFrame* frame, // Used only for native printing workflow.
WebKit::WebNode* node, bool InitPrintSettings(WebKit::WebFrame* frame);
bool is_preview);
// Initialize print page settings with default settings and prepare the frame // Initialize print page settings with default settings and prepare the frame
// for print. A new PrepareFrameAndViewForPrint is created to fulfill the // for print. A new PrepareFrameAndViewForPrint is created to fulfill the
// request and is filled into the |prepare| argument. // request and is filled into the |prepare| argument.
// Used only for native printing workflow.
bool InitPrintSettingsAndPrepareFrame( bool InitPrintSettingsAndPrepareFrame(
WebKit::WebFrame* frame, WebKit::WebFrame* frame,
WebKit::WebNode* node, WebKit::WebNode* node,
@ -334,6 +334,7 @@ class PrintWebViewHelper : public RenderViewObserver,
PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED, PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED,
PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE, PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE,
PREVIEW_ERROR_UPDATING_PRINT_SETTINGS, PREVIEW_ERROR_UPDATING_PRINT_SETTINGS,
PREVIEW_ERROR_INVALID_PRINTER_SETTINGS,
PREVIEW_ERROR_LAST_ENUM // Always last. PREVIEW_ERROR_LAST_ENUM // Always last.
}; };
@ -390,6 +391,7 @@ class PrintWebViewHelper : public RenderViewObserver,
printing::PreviewMetafile* metafile() const; printing::PreviewMetafile* metafile() const;
const PrintMsg_Print_Params& print_params() const; const PrintMsg_Print_Params& print_params() const;
const gfx::Size& GetPrintCanvasSize() const; const gfx::Size& GetPrintCanvasSize() const;
int last_error() const;
private: private:
enum State { enum State {

@ -489,7 +489,6 @@ TEST_F(PrintWebViewHelperPreviewTest, OnPrintForPrintPreviewFail) {
DictionaryValue empty_dict; DictionaryValue empty_dict;
PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(empty_dict); PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(empty_dict);
VerifyPrintFailed(true);
VerifyPagesPrinted(false); VerifyPagesPrinted(false);
} }
@ -530,6 +529,7 @@ TEST_F(PrintWebViewHelperPreviewTest,
CreatePrintSettingsDictionary(&dict); CreatePrintSettingsDictionary(&dict);
PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(dict); PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(dict);
VerifyPrintFailed(true);
VerifyPagesPrinted(false); VerifyPagesPrinted(false);
} }

@ -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 // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
@ -23,7 +23,7 @@ void PrintSettingsInitializerWin::InitPrintSettings(
print_settings->set_printer_name(dev_mode.dmDeviceName); print_settings->set_printer_name(dev_mode.dmDeviceName);
print_settings->set_device_name(new_device_name); 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->set_landscape(dev_mode.dmOrientation == DMORIENT_LANDSCAPE);
print_settings->selection_only = print_selection_only; print_settings->selection_only = print_selection_only;

@ -155,6 +155,11 @@ PrintingContext::Result PrintingContextCairo::UpdatePrinterSettings(
#else #else
DCHECK(!in_print_job_); DCHECK(!in_print_job_);
if (!print_dialog_) {
print_dialog_ = create_dialog_func_(this);
print_dialog_->AddRefToDialog();
}
if (!print_dialog_->UpdateSettings(job_settings, ranges)) if (!print_dialog_->UpdateSettings(job_settings, ranges))
return OnError(); return OnError();