summaryrefslogtreecommitdiffstats
path: root/chrome/browser/printing/print_job_worker.cc
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-13 22:54:12 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-13 22:54:12 +0000
commitb23aee0f939e07a9531935e7f0daa8a346912708 (patch)
tree6d10b5cde48ef5b3b1cf42831bded0960c40f7a6 /chrome/browser/printing/print_job_worker.cc
parent7ede31fe8ed08ff9c3e016a021a40d831e5e3587 (diff)
downloadchromium_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/print_job_worker.cc')
-rw-r--r--chrome/browser/printing/print_job_worker.cc50
1 files changed, 44 insertions, 6 deletions
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());