Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / printing / print_job_worker.cc
index f794785..5e3c59c 100644 (file)
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/printing/print_job.h"
-#include "chrome/browser/printing/printing_ui_web_contents_observer.h"
+#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
-#include "grit/generated_resources.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
 #include "printing/print_job_constants.h"
 #include "printing/printed_document.h"
 #include "printing/printed_page.h"
@@ -25,6 +26,8 @@
 
 using content::BrowserThread;
 
+namespace printing {
+
 namespace {
 
 // Helper function to ensure |owner| is valid until at least |callback| returns.
@@ -33,9 +36,41 @@ void HoldRefCallback(const scoped_refptr<printing::PrintJobWorkerOwner>& owner,
   callback.Run();
 }
 
-}  // namespace
+class PrintingContextDelegate : public PrintingContext::Delegate {
+ public:
+  PrintingContextDelegate(int render_process_id, int render_view_id);
+  virtual ~PrintingContextDelegate();
 
-namespace printing {
+  virtual gfx::NativeView GetParentView() OVERRIDE;
+  virtual std::string GetAppLocale() OVERRIDE;
+
+ private:
+  int render_process_id_;
+  int render_view_id_;
+};
+
+PrintingContextDelegate::PrintingContextDelegate(int render_process_id,
+                                                 int render_view_id)
+    : render_process_id_(render_process_id),
+      render_view_id_(render_view_id) {
+}
+
+PrintingContextDelegate::~PrintingContextDelegate() {
+}
+
+gfx::NativeView PrintingContextDelegate::GetParentView() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  content::RenderViewHost* view =
+      content::RenderViewHost::FromID(render_process_id_, render_view_id_);
+  if (!view)
+    return NULL;
+  content::WebContents* wc = content::WebContents::FromRenderViewHost(view);
+  return wc ? wc->GetNativeView() : NULL;
+}
+
+std::string PrintingContextDelegate::GetAppLocale() {
+  return g_browser_process->GetApplicationLocale();
+}
 
 void NotificationCallback(PrintJobWorkerOwner* print_job,
                           JobEventDetails::Type detail_type,
@@ -49,22 +84,25 @@ void NotificationCallback(PrintJobWorkerOwner* print_job,
       content::Details<JobEventDetails>(details));
 }
 
-PrintJobWorker::PrintJobWorker(PrintJobWorkerOwner* owner)
-    : Thread("Printing_Worker"),
-      owner_(owner),
-      weak_factory_(this) {
+}  // namespace
+
+PrintJobWorker::PrintJobWorker(int render_process_id,
+                               int render_view_id,
+                               PrintJobWorkerOwner* owner)
+    : owner_(owner), thread_("Printing_Worker"), weak_factory_(this) {
   // The object is created in the IO thread.
-  DCHECK_EQ(owner_->message_loop(), base::MessageLoop::current());
+  DCHECK(owner_->RunsTasksOnCurrentThread());
 
-  printing_context_.reset(PrintingContext::Create(
-      g_browser_process->GetApplicationLocale()));
+  printing_context_delegate_.reset(
+      new PrintingContextDelegate(render_process_id, render_view_id));
+  printing_context_ = PrintingContext::Create(printing_context_delegate_.get());
 }
 
 PrintJobWorker::~PrintJobWorker() {
   // The object is normally deleted in the UI thread, but when the user
   // cancels printing or in the case of print preview, the worker is destroyed
   // on the I/O thread.
-  DCHECK_EQ(owner_->message_loop(), base::MessageLoop::current());
+  DCHECK(owner_->RunsTasksOnCurrentThread());
   Stop();
 }
 
@@ -73,18 +111,12 @@ void PrintJobWorker::SetNewOwner(PrintJobWorkerOwner* new_owner) {
   owner_ = new_owner;
 }
 
-void PrintJobWorker::SetPrintDestination(
-    PrintDestinationInterface* destination) {
-  destination_ = destination;
-}
-
 void PrintJobWorker::GetSettings(
     bool ask_user_for_settings,
-    scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer,
     int document_page_count,
     bool has_selection,
     MarginType margin_type) {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
   DCHECK_EQ(page_number_, PageNumber::npos());
 
   // Recursive task processing is needed for the dialog in case it needs to be
@@ -97,13 +129,12 @@ void PrintJobWorker::GetSettings(
 
   // When we delegate to a destination, we don't ask the user for settings.
   // TODO(mad): Ask the destination for settings.
-  if (ask_user_for_settings && destination_.get() == NULL) {
+  if (ask_user_for_settings) {
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
         base::Bind(&HoldRefCallback, make_scoped_refptr(owner_),
                    base::Bind(&PrintJobWorker::GetSettingsWithUI,
                               base::Unretained(this),
-                              base::Passed(&web_contents_observer),
                               document_page_count,
                               has_selection)));
   } else {
@@ -116,8 +147,8 @@ void PrintJobWorker::GetSettings(
 }
 
 void PrintJobWorker::SetSettings(
-    const base::DictionaryValue* const new_settings) {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+    scoped_ptr<base::DictionaryValue> new_settings) {
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
 
   BrowserThread::PostTask(
       BrowserThread::UI,
@@ -126,11 +157,12 @@ void PrintJobWorker::SetSettings(
                  make_scoped_refptr(owner_),
                  base::Bind(&PrintJobWorker::UpdatePrintSettings,
                             base::Unretained(this),
-                            base::Owned(new_settings))));
+                            base::Passed(&new_settings))));
 }
 
 void PrintJobWorker::UpdatePrintSettings(
-    const base::DictionaryValue* const new_settings) {
+    scoped_ptr<base::DictionaryValue> new_settings) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PrintingContext::Result result =
       printing_context_->UpdatePrintSettings(*new_settings);
   GetSettingsDone(result);
@@ -147,36 +179,31 @@ void PrintJobWorker::GetSettingsDone(PrintingContext::Result result) {
   // We can't use OnFailure() here since owner_ may not support notifications.
 
   // PrintJob will create the new PrintedDocument.
-  owner_->message_loop()->PostTask(
-      FROM_HERE,
-      base::Bind(&PrintJobWorkerOwner::GetSettingsDone,
-                 make_scoped_refptr(owner_), printing_context_->settings(),
-                 result));
+  owner_->PostTask(FROM_HERE,
+                   base::Bind(&PrintJobWorkerOwner::GetSettingsDone,
+                              make_scoped_refptr(owner_),
+                              printing_context_->settings(),
+                              result));
 }
 
 void PrintJobWorker::GetSettingsWithUI(
-    scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer,
     int document_page_count,
     bool has_selection) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  gfx::NativeView parent_view = web_contents_observer->GetParentView();
-  if (!parent_view) {
-    GetSettingsWithUIDone(printing::PrintingContext::FAILED);
-    return;
-  }
   printing_context_->AskUserForSettings(
-      parent_view, document_page_count, has_selection,
+      document_page_count,
+      has_selection,
       base::Bind(&PrintJobWorker::GetSettingsWithUIDone,
                  base::Unretained(this)));
 }
 
 void PrintJobWorker::GetSettingsWithUIDone(PrintingContext::Result result) {
-  message_loop()->PostTask(
-      FROM_HERE,
-      base::Bind(&HoldRefCallback, make_scoped_refptr(owner_),
-                 base::Bind(&PrintJobWorker::GetSettingsDone,
-                            base::Unretained(this), result)));
+  PostTask(FROM_HERE,
+           base::Bind(&HoldRefCallback,
+                      make_scoped_refptr(owner_),
+                      base::Bind(&PrintJobWorker::GetSettingsDone,
+                                 base::Unretained(this),
+                                 result)));
 }
 
 void PrintJobWorker::UseDefaultSettings() {
@@ -185,9 +212,9 @@ void PrintJobWorker::UseDefaultSettings() {
 }
 
 void PrintJobWorker::StartPrinting(PrintedDocument* new_document) {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
   DCHECK_EQ(page_number_, PageNumber::npos());
-  DCHECK_EQ(document_, new_document);
+  DCHECK_EQ(document_.get(), new_document);
   DCHECK(document_.get());
 
   if (!document_.get() || page_number_ != PageNumber::npos() ||
@@ -218,7 +245,7 @@ void PrintJobWorker::StartPrinting(PrintedDocument* new_document) {
 }
 
 void PrintJobWorker::OnDocumentChanged(PrintedDocument* new_document) {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
   DCHECK_EQ(page_number_, PageNumber::npos());
 
   if (page_number_ != PageNumber::npos())
@@ -232,7 +259,7 @@ void PrintJobWorker::OnNewPage() {
     return;
 
   // message_loop() could return NULL when the print job is cancelled.
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
 
   if (page_number_ == PageNumber::npos()) {
     // Find first page to print.
@@ -245,15 +272,13 @@ void PrintJobWorker::OnNewPage() {
     }
     // We have enough information to initialize page_number_.
     page_number_.Init(document_->settings(), page_count);
-    if (destination_.get() != NULL)
-      destination_->SetPageCount(page_count);
   }
   DCHECK_NE(page_number_, PageNumber::npos());
 
   while (true) {
     // Is the page available?
     scoped_refptr<PrintedPage> page = document_->GetPage(page_number_.ToInt());
-    if (!page) {
+    if (!page.get()) {
       // We need to wait for the page to be available.
       base::MessageLoop::current()->PostDelayedTask(
           FROM_HERE,
@@ -279,8 +304,33 @@ void PrintJobWorker::Cancel() {
   // context we run.
 }
 
+bool PrintJobWorker::IsRunning() const {
+  return thread_.IsRunning();
+}
+
+bool PrintJobWorker::PostTask(const tracked_objects::Location& from_here,
+                              const base::Closure& task) {
+  if (task_runner_.get())
+    return task_runner_->PostTask(from_here, task);
+  return false;
+}
+
+void PrintJobWorker::StopSoon() {
+  thread_.StopSoon();
+}
+
+void PrintJobWorker::Stop() {
+  thread_.Stop();
+}
+
+bool PrintJobWorker::Start() {
+  bool result = thread_.Start();
+  task_runner_ = thread_.task_runner();
+  return result;
+}
+
 void PrintJobWorker::OnDocumentDone() {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
   DCHECK_EQ(page_number_, PageNumber::npos());
   DCHECK(document_.get());
 
@@ -289,24 +339,28 @@ void PrintJobWorker::OnDocumentDone() {
     return;
   }
 
-  owner_->message_loop()->PostTask(
-      FROM_HERE, base::Bind(NotificationCallback, make_scoped_refptr(owner_),
-                            JobEventDetails::DOC_DONE, document_,
-                            scoped_refptr<PrintedPage>()));
+  owner_->PostTask(FROM_HERE,
+                   base::Bind(&NotificationCallback,
+                              make_scoped_refptr(owner_),
+                              JobEventDetails::DOC_DONE,
+                              document_,
+                              scoped_refptr<PrintedPage>()));
 
   // Makes sure the variables are reinitialized.
   document_ = NULL;
 }
 
 void PrintJobWorker::SpoolPage(PrintedPage* page) {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
   DCHECK_NE(page_number_, PageNumber::npos());
 
   // Signal everyone that the page is about to be printed.
-  owner_->message_loop()->PostTask(
-      FROM_HERE, base::Bind(NotificationCallback, make_scoped_refptr(owner_),
-                            JobEventDetails::NEW_PAGE, document_,
-                            make_scoped_refptr(page)));
+  owner_->PostTask(FROM_HERE,
+                   base::Bind(&NotificationCallback,
+                              make_scoped_refptr(owner_),
+                              JobEventDetails::NEW_PAGE,
+                              document_,
+                              make_scoped_refptr(page)));
 
   // Preprocess.
   if (printing_context_->NewPage() != PrintingContext::OK) {
@@ -314,18 +368,6 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) {
     return;
   }
 
-  if (destination_.get() != NULL) {
-    std::vector<uint8> metabytes(page->metafile()->GetDataSize());
-    bool success = page->metafile()->GetData(
-        reinterpret_cast<void*>(&metabytes[0]), metabytes.size());
-    DCHECK(success) << "Failed to get metafile data.";
-    destination_->SetPageContent(
-        page->page_number(),
-        reinterpret_cast<void*>(&metabytes[0]),
-        metabytes.size());
-    return;
-  }
-
   // Actual printing.
 #if defined(OS_WIN) || defined(OS_MACOSX)
   document_->RenderPrintedPage(*page, printing_context_->context());
@@ -340,23 +382,26 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) {
   }
 
   // Signal everyone that the page is printed.
-  owner_->message_loop()->PostTask(
-      FROM_HERE,
-      base::Bind(NotificationCallback, make_scoped_refptr(owner_),
-                 JobEventDetails::PAGE_DONE, document_,
-                 make_scoped_refptr(page)));
+  owner_->PostTask(FROM_HERE,
+                   base::Bind(&NotificationCallback,
+                              make_scoped_refptr(owner_),
+                              JobEventDetails::PAGE_DONE,
+                              document_,
+                              make_scoped_refptr(page)));
 }
 
 void PrintJobWorker::OnFailure() {
-  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
 
   // We may loose our last reference by broadcasting the FAILED event.
   scoped_refptr<PrintJobWorkerOwner> handle(owner_);
 
-  owner_->message_loop()->PostTask(
-      FROM_HERE, base::Bind(NotificationCallback, make_scoped_refptr(owner_),
-                            JobEventDetails::FAILED, document_,
-                            scoped_refptr<PrintedPage>()));
+  owner_->PostTask(FROM_HERE,
+                   base::Bind(&NotificationCallback,
+                              make_scoped_refptr(owner_),
+                              JobEventDetails::FAILED,
+                              document_,
+                              scoped_refptr<PrintedPage>()));
   Cancel();
 
   // Makes sure the variables are reinitialized.