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:
chrome
app
browser
renderer
printing
@ -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(), ¶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,
|
||||
|
@ -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();
|
||||
|
||||
|
Reference in New Issue
Block a user