chore: add logging for print_backend failures (#29884)

This commit is contained in:
Shelley Vohr 2021-10-05 09:16:04 +02:00 committed by GitHub
parent d7a7c120d1
commit d2508a6941
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 12 deletions

View file

@ -47,7 +47,10 @@ printing::PrinterList GetPrinterList() {
// TODO(deepak1556): Deprecate this api in favor of an // TODO(deepak1556): Deprecate this api in favor of an
// async version and post a non blocing task call. // async version and post a non blocing task call.
base::ThreadRestrictions::ScopedAllowIO allow_io; base::ThreadRestrictions::ScopedAllowIO allow_io;
printing::mojom::ResultCode code =
print_backend->EnumeratePrinters(&printers); print_backend->EnumeratePrinters(&printers);
if (code != printing::mojom::ResultCode::kSuccess)
LOG(INFO) << "Failed to enumerate printers";
} }
return printers; return printers;
} }

View file

@ -424,7 +424,7 @@ bool IsDeviceNameValid(const std::u16string& device_name) {
#endif #endif
} }
std::u16string GetDefaultPrinterAsync() { std::pair<std::string, std::u16string> GetDefaultPrinterAsync() {
#if defined(OS_WIN) #if defined(OS_WIN)
// Blocking is needed here because Windows printer drivers are oftentimes // Blocking is needed here because Windows printer drivers are oftentimes
// not thread-safe and have to be accessed on the UI thread. // not thread-safe and have to be accessed on the UI thread.
@ -435,18 +435,25 @@ std::u16string GetDefaultPrinterAsync() {
printing::PrintBackend::CreateInstance( printing::PrintBackend::CreateInstance(
g_browser_process->GetApplicationLocale()); g_browser_process->GetApplicationLocale());
std::string printer_name; std::string printer_name;
printing::mojom::ResultCode code =
print_backend->GetDefaultPrinterName(printer_name); print_backend->GetDefaultPrinterName(printer_name);
// Some devices won't have a default printer, so we should // We don't want to return if this fails since some devices won't have a
// also check for existing printers and pick the first // default printer.
// one should it exist. if (code != printing::mojom::ResultCode::kSuccess)
LOG(ERROR) << "Failed to get default printer name";
// Check for existing printers and pick the first one should it exist.
if (printer_name.empty()) { if (printer_name.empty()) {
printing::PrinterList printers; printing::PrinterList printers;
print_backend->EnumeratePrinters(&printers); if (print_backend->EnumeratePrinters(&printers) !=
printing::mojom::ResultCode::kSuccess)
return std::make_pair("Failed to enumerate printers", std::u16string());
if (!printers.empty()) if (!printers.empty())
printer_name = printers.front().printer_name; printer_name = printers.front().printer_name;
} }
return base::UTF8ToUTF16(printer_name);
return std::make_pair(std::string(), base::UTF8ToUTF16(printer_name));
} }
// Copied from // Copied from
@ -2435,7 +2442,8 @@ void WebContents::OnGetDefaultPrinter(
printing::CompletionCallback print_callback, printing::CompletionCallback print_callback,
std::u16string device_name, std::u16string device_name,
bool silent, bool silent,
std::u16string default_printer) { // <error, default_printer>
std::pair<std::string, std::u16string> info) {
// The content::WebContents might be already deleted at this point, and the // The content::WebContents might be already deleted at this point, and the
// PrintViewManagerElectron class does not do null check. // PrintViewManagerElectron class does not do null check.
if (!web_contents()) { if (!web_contents()) {
@ -2444,8 +2452,14 @@ void WebContents::OnGetDefaultPrinter(
return; return;
} }
std::u16string printer_name = if (!info.first.empty()) {
device_name.empty() ? default_printer : device_name; if (print_callback)
std::move(print_callback).Run(false, info.first);
return;
}
// If the user has passed a deviceName use it, otherwise use default printer.
std::u16string printer_name = device_name.empty() ? info.second : device_name;
// If there are no valid printers available on the network, we bail. // If there are no valid printers available on the network, we bail.
if (printer_name.empty() || !IsDeviceNameValid(printer_name)) { if (printer_name.empty() || !IsDeviceNameValid(printer_name)) {

View file

@ -221,7 +221,8 @@ class WebContents : public gin::Wrappable<WebContents>,
printing::CompletionCallback print_callback, printing::CompletionCallback print_callback,
std::u16string device_name, std::u16string device_name,
bool silent, bool silent,
std::u16string default_printer); // <error, default_printer_name>
std::pair<std::string, std::u16string> info);
void Print(gin::Arguments* args); void Print(gin::Arguments* args);
// Print current page as PDF. // Print current page as PDF.
v8::Local<v8::Promise> PrintToPDF(base::DictionaryValue settings); v8::Local<v8::Promise> PrintToPDF(base::DictionaryValue settings);