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.
</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.

@ -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);

@ -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,

@ -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'));

@ -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));

@ -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();

@ -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 {

@ -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);
}

@ -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;

@ -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();