Chromium Code Reviews| Index: chrome/browser/printing/print_job_worker.cc |
| diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc |
| index e7f4d329443ce21992df9c9e48fdc43e45df2f57..8810935e86744ea7f8bdb350b228543713aa7a3c 100644 |
| --- a/chrome/browser/printing/print_job_worker.cc |
| +++ b/chrome/browser/printing/print_job_worker.cc |
| @@ -16,6 +16,8 @@ |
| #include "chrome/browser/printing/printing_ui_web_contents_observer.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/notification_service.h" |
| +#include "content/public/browser/render_view_host.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "grit/generated_resources.h" |
| #include "printing/print_job_constants.h" |
| #include "printing/printed_document.h" |
| @@ -35,7 +37,59 @@ 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(); |
| + |
| + virtual gfx::NativeView GetParentView() OVERRIDE; |
| + virtual std::string GetAppLocale() OVERRIDE; |
| + |
| + private: |
| + void InitOnUiThread(int render_process_id, int render_view_id); |
| + |
| + base::WeakPtrFactory<PrintingContextDelegate> weak_ptr_factory_; |
|
Noam Samuel
2014/08/21 00:03:53
Should be last.
Vitaly Buka (NO REVIEWS)
2014/08/21 01:19:16
Done.
|
| + scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer_; |
| +}; |
| + |
| +PrintingContextDelegate::PrintingContextDelegate(int render_process_id, |
| + int render_view_id) |
| + : weak_ptr_factory_(this) { |
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&PrintingContextDelegate::InitOnUiThread, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + render_process_id, |
| + render_view_id)); |
| +} |
| + |
| +PrintingContextDelegate::~PrintingContextDelegate() { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| +} |
| + |
| +gfx::NativeView PrintingContextDelegate::GetParentView() { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!web_contents_observer_) |
| + return NULL; |
| + return web_contents_observer_->GetParentView(); |
| +} |
| + |
| +std::string PrintingContextDelegate::GetAppLocale() { |
| + return g_browser_process->GetApplicationLocale(); |
| +} |
| + |
| +void PrintingContextDelegate::InitOnUiThread(int render_process_id, |
| + int render_view_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + content::RenderViewHost* view = |
| + content::RenderViewHost::FromID(render_process_id, render_view_id); |
| + if (!view) |
| + return; |
| + content::WebContents* wc = content::WebContents::FromRenderViewHost(view); |
| + if (!wc) |
| + return; |
| + web_contents_observer_.reset(new PrintingUIWebContentsObserver(wc)); |
| +} |
| void NotificationCallback(PrintJobWorkerOwner* print_job, |
| JobEventDetails::Type detail_type, |
| @@ -49,13 +103,18 @@ void NotificationCallback(PrintJobWorkerOwner* print_job, |
| content::Details<JobEventDetails>(details)); |
| } |
| -PrintJobWorker::PrintJobWorker(PrintJobWorkerOwner* owner) |
| +} // 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(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() { |
| @@ -64,6 +123,9 @@ PrintJobWorker::~PrintJobWorker() { |
| // on the I/O thread. |
| DCHECK(owner_->RunsTasksOnCurrentThread()); |
| Stop(); |
| + printing_context_.reset(); |
| + BrowserThread::DeleteSoon( |
|
Noam Samuel
2014/08/21 00:03:53
Can also use scoped ptr with custom deleter maybe?
Vitaly Buka (NO REVIEWS)
2014/08/21 01:19:16
Current deleter for scoper_refptr. I'll try to cha
|
| + BrowserThread::UI, FROM_HERE, printing_context_delegate_.release()); |
| } |
| void PrintJobWorker::SetNewOwner(PrintJobWorkerOwner* new_owner) { |
| @@ -78,7 +140,6 @@ void PrintJobWorker::SetPrintDestination( |
| void PrintJobWorker::GetSettings( |
| bool ask_user_for_settings, |
| - scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer, |
| int document_page_count, |
| bool has_selection, |
| MarginType margin_type) { |
| @@ -101,12 +162,9 @@ void PrintJobWorker::GetSettings( |
| 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 { |
| - BrowserThread::DeleteSoon( |
| - BrowserThread::UI, FROM_HERE, web_contents_observer.release()); |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| base::Bind(&HoldRefCallback, make_scoped_refptr(owner_), |
| @@ -131,6 +189,7 @@ void PrintJobWorker::SetSettings( |
| void PrintJobWorker::UpdatePrintSettings( |
| scoped_ptr<base::DictionaryValue> new_settings) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| PrintingContext::Result result = |
| printing_context_->UpdatePrintSettings(*new_settings); |
| GetSettingsDone(result); |
| @@ -155,18 +214,12 @@ void PrintJobWorker::GetSettingsDone(PrintingContext::Result 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))); |
| } |
| @@ -316,7 +369,7 @@ void PrintJobWorker::OnDocumentDone() { |
| } |
| owner_->PostTask(FROM_HERE, |
| - base::Bind(NotificationCallback, |
| + base::Bind(&NotificationCallback, |
| make_scoped_refptr(owner_), |
| JobEventDetails::DOC_DONE, |
| document_, |
| @@ -332,7 +385,7 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) { |
| // Signal everyone that the page is about to be printed. |
| owner_->PostTask(FROM_HERE, |
| - base::Bind(NotificationCallback, |
| + base::Bind(&NotificationCallback, |
| make_scoped_refptr(owner_), |
| JobEventDetails::NEW_PAGE, |
| document_, |
| @@ -371,7 +424,7 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) { |
| // Signal everyone that the page is printed. |
| owner_->PostTask(FROM_HERE, |
| - base::Bind(NotificationCallback, |
| + base::Bind(&NotificationCallback, |
| make_scoped_refptr(owner_), |
| JobEventDetails::PAGE_DONE, |
| document_, |
| @@ -385,7 +438,7 @@ void PrintJobWorker::OnFailure() { |
| scoped_refptr<PrintJobWorkerOwner> handle(owner_); |
| owner_->PostTask(FROM_HERE, |
| - base::Bind(NotificationCallback, |
| + base::Bind(&NotificationCallback, |
| make_scoped_refptr(owner_), |
| JobEventDetails::FAILED, |
| document_, |