#include "chrome/browser/ui/webui/print_preview/pdf_printer_handler.h"
#include <utility>
#include "base/check.h"
#include "base/command_line.h"
#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/i18n/file_util_icu.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/thread_pool.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/printing/print_preview_dialog_controller.h"
#include "chrome/browser/printing/print_preview_sticky_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "components/account_id/account_id.h"
#include "components/cloud_devices/common/printer_description.h"
#include "components/url_formatter/url_formatter.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "net/base/filename_util.h"
#include "printing/backend/print_backend.h"
#include "printing/mojom/print.mojom.h"
#include "printing/print_job_constants.h"
#include "printing/printing_context.h"
#include "printing/units.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/shell_dialogs/selected_file_info.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_MAC)
#include "chrome/common/printing/printer_capabilities_mac.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "components/drive/file_system_core_util.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/drive/drive_integration_service.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h"
#include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.h"
#include "components/user_manager/user.h"
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chrome/common/chrome_paths_lacros.h"
#include "chromeos/crosapi/mojom/holding_space_service.mojom.h"
#include "chromeos/lacros/lacros_service.h"
#endif
#if defined(USE_AURA)
#include "ui/aura/window.h"
#endif
namespace printing {
namespace {
constexpr base::FilePath::CharType kPdfExtension[] = …);
class PrintingContextDelegate : public PrintingContext::Delegate { … };
const AccountId& GetAccountId(Profile* profile) { … }
gfx::Size GetDefaultPdfMediaSizeMicrons() { … }
base::Value::Dict GetPdfCapabilities(
const std::string& locale,
PrinterSemanticCapsAndDefaults::Papers custom_papers) { … }
void PrintToPdfCallback(scoped_refptr<base::RefCountedMemory> data,
const base::FilePath& path) { … }
void OnPdfPrintedCallback(const AccountId& account_id,
bool from_incognito_profile,
const base::FilePath& path,
base::OnceClosure pdf_file_saved_closure) { … }
base::FilePath CreateDirectoryIfNotExists(const base::FilePath& path) { … }
base::FilePath SelectSaveDirectory(const base::FilePath& path,
const base::FilePath& default_path) { … }
void ConstructCapabilitiesAndCompleteCallback(
const std::string& destination_id,
PdfPrinterHandler::GetCapabilityCallback callback,
PrinterSemanticCapsAndDefaults::Papers custom_papers) { … }
}
PdfPrinterHandler::PdfPrinterHandler(
Profile* profile,
content::WebContents* preview_web_contents,
PrintPreviewStickySettings* sticky_settings)
: … { … }
PdfPrinterHandler::~PdfPrinterHandler() { … }
void PdfPrinterHandler::Reset() { … }
void PdfPrinterHandler::StartGetPrinters(
AddedPrintersCallback added_printers_callback,
GetPrintersDoneCallback done_callback) { … }
void PdfPrinterHandler::StartGetCapability(const std::string& destination_id,
GetCapabilityCallback callback) { … }
void PdfPrinterHandler::StartPrint(
const std::u16string& job_title,
base::Value::Dict settings,
scoped_refptr<base::RefCountedMemory> print_data,
PrintCallback callback) { … }
void PdfPrinterHandler::FileSelected(const ui::SelectedFileInfo& file,
int ) { … }
void PdfPrinterHandler::FileSelectionCanceled() { … }
void PdfPrinterHandler::SetPdfSavedClosureForTesting(
base::OnceClosure closure) { … }
void PdfPrinterHandler::SetPrintToPdfPathForTesting(
const base::FilePath& path) { … }
base::FilePath PdfPrinterHandler::GetFileNameForPrintJobTitle(
const std::u16string& job_title) { … }
base::FilePath PdfPrinterHandler::GetFileNameForURL(const GURL& url) { … }
base::FilePath PdfPrinterHandler::GetFileName(const GURL& url,
const std::u16string& job_title,
bool is_savable) { … }
void PdfPrinterHandler::SelectFile(const base::FilePath& default_filename,
content::WebContents* initiator,
bool prompt_user) { … }
void PdfPrinterHandler::OnSaveLocationReady(
const base::FilePath& default_filename,
bool prompt_user,
const base::FilePath& path) { … }
void PdfPrinterHandler::PostPrintToPdfTask() { … }
void PdfPrinterHandler::OnGotUniqueFileName(const base::FilePath& path) { … }
void PdfPrinterHandler::OnDirectorySelected(const base::FilePath& filename,
const base::FilePath& directory) { … }
base::FilePath PdfPrinterHandler::GetSaveLocation() const { … }
}