diff options
author | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-13 22:54:12 +0000 |
---|---|---|
committer | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-13 22:54:12 +0000 |
commit | b23aee0f939e07a9531935e7f0daa8a346912708 (patch) | |
tree | 6d10b5cde48ef5b3b1cf42831bded0960c40f7a6 /chrome/browser/printing | |
parent | 7ede31fe8ed08ff9c3e016a021a40d831e5e3587 (diff) | |
download | chromium_src-b23aee0f939e07a9531935e7f0daa8a346912708.zip chromium_src-b23aee0f939e07a9531935e7f0daa8a346912708.tar.gz chromium_src-b23aee0f939e07a9531935e7f0daa8a346912708.tar.bz2 |
Wire up printing on the Mac
Get the printing support class stack building and hooked up on the Mac.
Add support for creating NativeMetafile objects with PDF print data on the renderer side, and passing them to the browser via the existing printing IPC system.
Flip on the simpler printing unit tests (those that don't require PDF -> bitmap conversion).
BUG=13158
TEST=Print on the Mac--it should work!
Review URL: http://codereview.chromium.org/276004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28907 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/printing')
-rw-r--r-- | chrome/browser/printing/print_job.cc | 7 | ||||
-rw-r--r-- | chrome/browser/printing/print_job_worker.cc | 50 | ||||
-rw-r--r-- | chrome/browser/printing/print_job_worker.h | 14 | ||||
-rw-r--r-- | chrome/browser/printing/print_view_manager.cc | 8 | ||||
-rw-r--r-- | chrome/browser/printing/printer_query.cc | 6 | ||||
-rw-r--r-- | chrome/browser/printing/printer_query.h | 3 |
6 files changed, 73 insertions, 15 deletions
diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc index d65b7bf..8a1a5e2 100644 --- a/chrome/browser/printing/print_job.cc +++ b/chrome/browser/printing/print_job.cc @@ -21,8 +21,8 @@ namespace printing { PrintJob::PrintJob() : ui_message_loop_(MessageLoop::current()), - worker_(), source_(NULL), + worker_(), settings_(), is_job_pending_(false), is_print_dialog_box_shown_(false), @@ -284,6 +284,10 @@ void PrintJob::OnDocumentDone() { void PrintJob::ControlledWorkerShutdown() { DCHECK_EQ(ui_message_loop_, MessageLoop::current()); + + // The deadlock this code works around is specific to window messaging on + // Windows, so we aren't likely to need it on any other platforms. +#if defined(OS_WIN) // We could easily get into a deadlock case if worker_->Stop() is used; the // printer driver created a window as a child of the browser window. By // canceling the job, the printer driver initiated dialog box is destroyed, @@ -323,6 +327,7 @@ void PrintJob::ControlledWorkerShutdown() { break; } } +#endif // Now make sure the thread object is cleaned up. worker_->Stop(); diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc index 375c2407..27a553d 100644 --- a/chrome/browser/printing/print_job_worker.cc +++ b/chrome/browser/printing/print_job_worker.cc @@ -5,6 +5,7 @@ #include "chrome/browser/printing/print_job_worker.h" #include "base/message_loop.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/browser/printing/print_job.h" #include "chrome/common/notification_service.h" #include "printing/printed_document.h" @@ -64,7 +65,7 @@ void PrintJobWorker::SetNewOwner(PrintJobWorkerOwner* new_owner) { } void PrintJobWorker::GetSettings(bool ask_user_for_settings, - HWND parent_window, + gfx::NativeWindow parent_window, int document_page_count, bool has_selection) { DCHECK_EQ(message_loop(), MessageLoop::current()); @@ -74,15 +75,24 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings, // destroyed by a task. MessageLoop::current()->SetNestableTasksAllowed(true); - PrintingContext::Result result; if (ask_user_for_settings) { - result = printing_context_.AskUserForSettings(parent_window, - document_page_count, - has_selection); +#if defined(OS_MACOSX) + ChromeThread::GetMessageLoop(ChromeThread::UI)->PostTask( + FROM_HERE, NewRunnableMethod(this, &PrintJobWorker::GetSettingsWithUI, + parent_window, document_page_count, + has_selection)); +#else + PrintingContext::Result result = printing_context_.AskUserForSettings( + parent_window, document_page_count, has_selection); + GetSettingsDone(result); +#endif } else { - result = printing_context_.UseDefaultSettings(); + PrintingContext::Result result = printing_context_.UseDefaultSettings(); + GetSettingsDone(result); } +} +void PrintJobWorker::GetSettingsDone(PrintingContext::Result result) { // Most PrintingContext functions may start a message loop and process // message recursively, so disable recursive task processing. MessageLoop::current()->SetNestableTasksAllowed(false); @@ -97,13 +107,29 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings, result)); } +#if defined(OS_MACOSX) +void PrintJobWorker::GetSettingsWithUI(gfx::NativeWindow parent_window, + int document_page_count, + bool has_selection) { + DCHECK_EQ(ChromeThread::GetMessageLoop(ChromeThread::UI), + MessageLoop::current()); + + PrintingContext::Result result = printing_context_.AskUserForSettings( + parent_window, document_page_count, has_selection); + message_loop()->PostTask(FROM_HERE, NewRunnableMethod( + this, &PrintJobWorker::GetSettingsDone, result)); +} +#endif + void PrintJobWorker::StartPrinting(PrintedDocument* new_document) { DCHECK_EQ(message_loop(), MessageLoop::current()); DCHECK_EQ(page_number_, PageNumber::npos()); DCHECK_EQ(document_, new_document); DCHECK(document_.get()); DCHECK(new_document->settings().Equals(printing_context_.settings())); +#if !defined(OS_MACOSX) DCHECK(printing_context_.context()); +#endif if (!document_.get() || page_number_ != PageNumber::npos() || document_ != new_document) { return; @@ -130,7 +156,9 @@ void PrintJobWorker::OnDocumentChanged(PrintedDocument* new_document) { DCHECK_EQ(page_number_, PageNumber::npos()); DCHECK(!new_document || new_document->settings().Equals(printing_context_.settings())); +#if !defined(OS_MACOSX) DCHECK(printing_context_.context()); +#endif if (page_number_ != PageNumber::npos()) return; @@ -144,9 +172,11 @@ void PrintJobWorker::OnNewPage() { } // message_loop() could return NULL when the print job is cancelled. DCHECK_EQ(message_loop(), MessageLoop::current()); +#if !defined(OS_MACOSX) DCHECK(printing_context_.context()); if (!printing_context_.context()) return; +#endif if (page_number_ == PageNumber::npos()) { // Find first page to print. @@ -199,7 +229,9 @@ void PrintJobWorker::OnDocumentDone() { DCHECK_EQ(message_loop(), MessageLoop::current()); DCHECK_EQ(page_number_, PageNumber::npos()); DCHECK(document_.get()); +#if !defined(OS_MACOSX) DCHECK(printing_context_.context()); +#endif if (printing_context_.DocumentDone() != PrintingContext::OK) { OnFailure(); @@ -221,7 +253,9 @@ void PrintJobWorker::OnDocumentDone() { void PrintJobWorker::SpoolPage(PrintedPage& page) { DCHECK_EQ(message_loop(), MessageLoop::current()); DCHECK_NE(page_number_, PageNumber::npos()); +#if !defined(OS_MACOSX) DCHECK(printing_context_.context()); +#endif // Signal everyone that the page is about to be printed. NotificationTask* task = new NotificationTask(); task->Init(owner_, @@ -236,6 +270,10 @@ void PrintJobWorker::SpoolPage(PrintedPage& page) { return; } +#if defined(OS_MACOSX) + // Context is only valid between NewPage and PageDone, so we only check here. + DCHECK(printing_context_.context()); +#endif // Actual printing. document_->RenderPrintedPage(page, printing_context_.context()); diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h index fce8912..56e7893 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_H__ #define CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_H__ +#include "app/gfx/native_widget_types.h" #include "base/task.h" #include "base/thread.h" #include "printing/page_number.h" @@ -33,7 +34,7 @@ class PrintJobWorker : public base::Thread { // Initializes the print settings. If |ask_user_for_settings| is true, a // Print... dialog box will be shown to ask the user his preference. void GetSettings(bool ask_user_for_settings, - HWND parent_window, + gfx::NativeWindow parent_window, int document_page_count, bool has_selection); @@ -78,6 +79,17 @@ class PrintJobWorker : public base::Thread { // context. void OnFailure(); +#if defined(OS_MACOSX) + // Asks the user for print settings. Must be called on the UI thread. + // Mac-only since Windows can display UI from non-main threads. + void GetSettingsWithUI(gfx::NativeWindow parent_window, + int document_page_count, + bool has_selection); +#endif + + // Reports settings back to owner_. + void GetSettingsDone(PrintingContext::Result result); + // Information about the printer setting. PrintingContext printing_context_; diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index 22f3abe..4f6e73a 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc @@ -24,10 +24,10 @@ using base::TimeDelta; namespace printing { PrintViewManager::PrintViewManager(TabContents& owner) - : owner_(owner), - waiting_to_print_(false), + : waiting_to_print_(false), printing_succeeded_(false), - inside_inner_message_loop_(false) { + inside_inner_message_loop_(false), + owner_(owner) { } PrintViewManager::~PrintViewManager() { @@ -101,6 +101,7 @@ void PrintViewManager::DidPrintPage( return; } +#if defined(OS_WIN) // http://msdn2.microsoft.com/en-us/library/ms535522.aspx // Windows 2000/XP: When a page in a spooled file exceeds approximately 350 // MB, it can fail to print and not send an error message. @@ -110,6 +111,7 @@ void PrintViewManager::DidPrintPage( owner_.Stop(); return; } +#endif base::SharedMemory shared_buf(params.metafile_data_handle, true); if (!shared_buf.Map(params.data_size)) { diff --git a/chrome/browser/printing/printer_query.cc b/chrome/browser/printing/printer_query.cc index 3bcee7a..4fdadbe 100644 --- a/chrome/browser/printing/printer_query.cc +++ b/chrome/browser/printing/printer_query.cc @@ -17,8 +17,8 @@ PrinterQuery::PrinterQuery() : ui_message_loop_(MessageLoop::current()), worker_(new PrintJobWorker(this)), is_print_dialog_box_shown_(false), - last_status_(PrintingContext::FAILED), - cookie_(PrintSettings::NewCookie()) { + cookie_(PrintSettings::NewCookie()), + last_status_(PrintingContext::FAILED) { } PrinterQuery::~PrinterQuery() { @@ -62,7 +62,7 @@ PrintJobWorker* PrinterQuery::DetachWorker(PrintJobWorkerOwner* new_owner) { } void PrinterQuery::GetSettings(GetSettingsAskParam ask_user_for_settings, - HWND parent_window, + gfx::NativeWindow parent_window, int expected_page_count, bool has_selection, CancelableTask* callback) { diff --git a/chrome/browser/printing/printer_query.h b/chrome/browser/printing/printer_query.h index b0502c8..b4826ec 100644 --- a/chrome/browser/printing/printer_query.h +++ b/chrome/browser/printing/printer_query.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_PRINTING_PRINTER_QUERY_H_ #define CHROME_BROWSER_PRINTING_PRINTER_QUERY_H_ +#include "app/gfx/native_widget_types.h" #include "base/scoped_ptr.h" #include "chrome/browser/printing/print_job_worker_owner.h" @@ -47,7 +48,7 @@ class PrinterQuery : public PrintJobWorkerOwner { // owner of the print setting dialog box. It is unused when // |ask_for_user_settings| is DEFAULTS. void GetSettings(GetSettingsAskParam ask_user_for_settings, - HWND parent_window, + gfx::NativeWindow parent_window, int expected_page_count, bool has_selection, CancelableTask* callback); |