blob: 2704948cfdcee3d4fa10352393c87ccd991fb107 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_PRINTING_PRINT_JOB_SUBMITTER_H_
#define CHROME_BROWSER_EXTENSIONS_API_PRINTING_PRINT_JOB_SUBMITTER_H_
#include <memory>
#include <string>
#include "base/auto_reset.h"
#include "base/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/printing/print_job.h"
#include "chrome/common/extensions/api/printing.h"
#include "chromeos/crosapi/mojom/local_printer.mojom-forward.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/native_widget_types.h"
namespace base {
class ReadOnlySharedMemoryRegion;
} // namespace base
namespace content {
class BrowserContext;
} // namespace content
namespace gfx {
class Image;
}
namespace printing {
namespace mojom {
class PdfFlattener;
} // namespace mojom
class PrintedDocument;
class PrintSettings;
} // namespace printing
class NativeWindowTracker;
namespace extensions {
class Extension;
class PrintJobController;
// Handles chrome.printing.submitJob() API request including parsing job
// arguments, sending errors and submitting print job to the printer.
class PrintJobSubmitter : public printing::PrintJob::Observer {
public:
// At most one of `job_id` and `error` are set.
// Either `job_id`, `print_job`, and `document` are all set or none of them
// are set.
using SubmitJobCallback =
base::OnceCallback<void(absl::optional<int> job_id,
printing::PrintJob* print_job,
printing::PrintedDocument* document,
absl::optional<std::string> error)>;
PrintJobSubmitter(gfx::NativeWindow native_window,
content::BrowserContext* browser_context,
PrintJobController* print_job_controller,
mojo::Remote<printing::mojom::PdfFlattener>* pdf_flattener,
scoped_refptr<const extensions::Extension> extension,
api::printing::SubmitJobRequest request,
#if BUILDFLAG(IS_CHROMEOS_LACROS)
int local_printer_version,
#endif
crosapi::mojom::LocalPrinter* local_printer,
SubmitJobCallback callback);
~PrintJobSubmitter() override;
static void Run(std::unique_ptr<PrintJobSubmitter> submitter);
static base::AutoReset<bool> DisablePdfFlatteningForTesting();
static base::AutoReset<bool> SkipConfirmationDialogForTesting();
// PrintJob::Observer:
void OnDocDone(int job_id, printing::PrintedDocument* document) override;
void OnFailed() override;
private:
friend class PrintingAPIHandler;
void Start();
bool CheckContentType() const;
bool CheckPrintTicket();
void CheckPrinter();
void CheckCapabilitiesCompatibility(
crosapi::mojom::CapabilitiesResponsePtr capabilities);
void ReadDocumentData();
void OnDocumentDataRead(std::unique_ptr<std::string> data,
int64_t total_blob_length);
void OnPdfFlattenerDisconnected();
void OnPdfFlattened(base::ReadOnlySharedMemoryRegion flattened_pdf);
void ShowPrintJobConfirmationDialog(const gfx::Image& extension_icon);
void OnPrintJobConfirmationDialogClosed(bool accepted);
void StartPrintJob();
void FireErrorCallback(const std::string& error);
gfx::NativeWindow native_window_;
const raw_ptr<content::BrowserContext> browser_context_;
// Tracks whether |native_window_| got destroyed.
std::unique_ptr<NativeWindowTracker> native_window_tracker_;
// These objects are owned by PrintingAPIHandler.
const raw_ptr<PrintJobController> print_job_controller_;
const raw_ptr<mojo::Remote<printing::mojom::PdfFlattener>> pdf_flattener_;
// TODO(crbug.com/996785): Consider tracking extension being unloaded instead
// of storing scoped_refptr.
scoped_refptr<const extensions::Extension> extension_;
scoped_refptr<printing::PrintJob> print_job_;
api::printing::SubmitJobRequest request_;
std::unique_ptr<printing::PrintSettings> settings_;
std::u16string printer_name_;
base::ReadOnlySharedMemoryMapping flattened_pdf_mapping_;
#if BUILDFLAG(IS_CHROMEOS_LACROS)
const int local_printer_version_;
#endif
const raw_ptr<crosapi::mojom::LocalPrinter> local_printer_;
SubmitJobCallback callback_;
base::WeakPtrFactory<PrintJobSubmitter> weak_ptr_factory_{this};
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_PRINTING_PRINT_JOB_SUBMITTER_H_