| Index: chrome/browser/printing/print_job.cc
|
| diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc
|
| index 6c5f25883d7458be6fd34e03b63c88eb05f6813f..976ef0d4e8268de856568b5d2dc4d5a30b3da0c9 100644
|
| --- a/chrome/browser/printing/print_job.cc
|
| +++ b/chrome/browser/printing/print_job.cc
|
| @@ -5,10 +5,12 @@
|
| #include "chrome/browser/printing/print_job.h"
|
|
|
| #include <memory>
|
| +#include <utility>
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/location.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| @@ -30,22 +32,20 @@
|
|
|
| using base::TimeDelta;
|
|
|
| +namespace printing {
|
| +
|
| namespace {
|
|
|
| // Helper function to ensure |owner| is valid until at least |callback| returns.
|
| -void HoldRefCallback(const scoped_refptr<printing::PrintJobWorkerOwner>& owner,
|
| +void HoldRefCallback(const scoped_refptr<PrintJobWorkerOwner>& owner,
|
| const base::Closure& callback) {
|
| callback.Run();
|
| }
|
|
|
| } // namespace
|
|
|
| -namespace printing {
|
| -
|
| PrintJob::PrintJob()
|
| - : source_(NULL),
|
| - worker_(),
|
| - settings_(),
|
| + : source_(nullptr),
|
| is_job_pending_(false),
|
| is_canceling_(false),
|
| quit_factory_(this) {
|
| @@ -68,7 +68,7 @@ void PrintJob::Initialize(PrintJobWorkerOwner* job,
|
| PrintedPagesSource* source,
|
| int page_count) {
|
| DCHECK(!source_);
|
| - DCHECK(!worker_.get());
|
| + DCHECK(!worker_);
|
| DCHECK(!is_job_pending_);
|
| DCHECK(!is_canceling_);
|
| DCHECK(!document_.get());
|
| @@ -105,7 +105,7 @@ void PrintJob::GetSettingsDone(const PrintSettings& new_settings,
|
|
|
| PrintJobWorker* PrintJob::DetachWorker(PrintJobWorkerOwner* new_owner) {
|
| NOTREACHED();
|
| - return NULL;
|
| + return nullptr;
|
| }
|
|
|
| const PrintSettings& PrintJob::settings() const {
|
| @@ -113,18 +113,18 @@ const PrintSettings& PrintJob::settings() const {
|
| }
|
|
|
| int PrintJob::cookie() const {
|
| + // Always use an invalid cookie in this case.
|
| if (!document_.get())
|
| - // Always use an invalid cookie in this case.
|
| return 0;
|
| return document_->cookie();
|
| }
|
|
|
| void PrintJob::StartPrinting() {
|
| DCHECK(RunsTasksOnCurrentThread());
|
| - DCHECK(worker_->IsRunning());
|
| - DCHECK(!is_job_pending_);
|
| - if (!worker_->IsRunning() || is_job_pending_)
|
| + if (!worker_->IsRunning() || is_job_pending_) {
|
| + NOTREACHED();
|
| return;
|
| + }
|
|
|
| // Real work is done in PrintJobWorker::StartPrinting().
|
| worker_->PostTask(FROM_HERE,
|
| @@ -137,7 +137,7 @@ void PrintJob::StartPrinting() {
|
|
|
| // Tell everyone!
|
| scoped_refptr<JobEventDetails> details(
|
| - new JobEventDetails(JobEventDetails::NEW_DOC, document_.get(), NULL));
|
| + new JobEventDetails(JobEventDetails::NEW_DOC, document_.get(), nullptr));
|
| content::NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_PRINT_JOB_EVENT,
|
| content::Source<PrintJob>(this),
|
| @@ -182,7 +182,7 @@ void PrintJob::Cancel() {
|
| }
|
| // Make sure a Cancel() is broadcast.
|
| scoped_refptr<JobEventDetails> details(
|
| - new JobEventDetails(JobEventDetails::FAILED, NULL, NULL));
|
| + new JobEventDetails(JobEventDetails::FAILED, nullptr, nullptr));
|
| content::NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_PRINT_JOB_EVENT,
|
| content::Source<PrintJob>(this),
|
| @@ -207,7 +207,7 @@ bool PrintJob::FlushJob(base::TimeDelta timeout) {
|
| }
|
|
|
| void PrintJob::DisconnectSource() {
|
| - source_ = NULL;
|
| + source_ = nullptr;
|
| if (document_.get())
|
| document_->DisconnectSource();
|
| }
|
| @@ -270,46 +270,50 @@ class PrintJob::PdfToEmfState {
|
| std::unique_ptr<PdfToEmfConverter> converter_;
|
| };
|
|
|
| +void PrintJob::AppendPrintedPage(int page_number) {
|
| + pdf_page_mapping_.push_back(page_number);
|
| +}
|
| +
|
| void PrintJob::StartPdfToEmfConversion(
|
| const scoped_refptr<base::RefCountedMemory>& bytes,
|
| const gfx::Size& page_size,
|
| const gfx::Rect& content_area) {
|
| - DCHECK(!ptd_to_emf_state_.get());
|
| - ptd_to_emf_state_.reset(new PdfToEmfState(page_size, content_area));
|
| + DCHECK(!pdf_to_emf_state_);
|
| + pdf_to_emf_state_ = base::MakeUnique<PdfToEmfState>(page_size, content_area);
|
| const int kPrinterDpi = settings().dpi();
|
| - ptd_to_emf_state_->Start(
|
| - bytes,
|
| - printing::PdfRenderSettings(content_area, kPrinterDpi, true),
|
| - base::Bind(&PrintJob::OnPdfToEmfStarted, this));
|
| + pdf_to_emf_state_->Start(bytes,
|
| + PdfRenderSettings(content_area, kPrinterDpi, true),
|
| + base::Bind(&PrintJob::OnPdfToEmfStarted, this));
|
| }
|
|
|
| void PrintJob::OnPdfToEmfStarted(int page_count) {
|
| if (page_count <= 0) {
|
| - ptd_to_emf_state_.reset();
|
| + pdf_to_emf_state_.reset();
|
| Cancel();
|
| return;
|
| }
|
| - ptd_to_emf_state_->set_page_count(page_count);
|
| - ptd_to_emf_state_->GetMorePages(
|
| + pdf_to_emf_state_->set_page_count(page_count);
|
| + pdf_to_emf_state_->GetMorePages(
|
| base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
|
| }
|
|
|
| void PrintJob::OnPdfToEmfPageConverted(int page_number,
|
| float scale_factor,
|
| std::unique_ptr<MetafilePlayer> emf) {
|
| - DCHECK(ptd_to_emf_state_);
|
| - if (!document_.get() || !emf) {
|
| - ptd_to_emf_state_.reset();
|
| + DCHECK(pdf_to_emf_state_);
|
| + if (!document_.get() || !emf || page_number < 0 ||
|
| + static_cast<size_t>(page_number) >= pdf_page_mapping_.size()) {
|
| + pdf_to_emf_state_.reset();
|
| Cancel();
|
| return;
|
| }
|
|
|
| // Update the rendered document. It will send notifications to the listener.
|
| - document_->SetPage(page_number, std::move(emf), scale_factor,
|
| - ptd_to_emf_state_->page_size(),
|
| - ptd_to_emf_state_->content_area());
|
| + document_->SetPage(pdf_page_mapping_[page_number], std::move(emf),
|
| + scale_factor, pdf_to_emf_state_->page_size(),
|
| + pdf_to_emf_state_->content_area());
|
|
|
| - ptd_to_emf_state_->GetMorePages(
|
| + pdf_to_emf_state_->GetMorePages(
|
| base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
|
| }
|
|
|
| @@ -321,9 +325,8 @@ void PrintJob::UpdatePrintedDocument(PrintedDocument* new_document) {
|
|
|
| document_ = new_document;
|
|
|
| - if (document_.get()) {
|
| + if (document_.get())
|
| settings_ = document_->settings();
|
| - }
|
|
|
| if (worker_) {
|
| DCHECK(!is_job_pending_);
|
| @@ -365,9 +368,9 @@ void PrintJob::OnNotifyPrintJobEvent(const JobEventDetails& event_details) {
|
| }
|
| case JobEventDetails::PAGE_DONE:
|
| #if defined(OS_WIN)
|
| - ptd_to_emf_state_->OnPageProcessed(
|
| + pdf_to_emf_state_->OnPageProcessed(
|
| base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
|
| -#endif // OS_WIN
|
| +#endif // defined(OS_WIN)
|
| break;
|
| default: {
|
| NOTREACHED();
|
| @@ -385,7 +388,7 @@ void PrintJob::OnDocumentDone() {
|
| Stop();
|
|
|
| scoped_refptr<JobEventDetails> details(
|
| - new JobEventDetails(JobEventDetails::JOB_DONE, document_.get(), NULL));
|
| + new JobEventDetails(JobEventDetails::JOB_DONE, document_.get(), nullptr));
|
| content::NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_PRINT_JOB_EVENT,
|
| content::Source<PrintJob>(this),
|
|
|