Index: chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
index e0a11e50259acc571042f4c1fd52dff7783983fe..16b30f20fc7d5228d2b432c3b1731fcef5c20de9 100644 |
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
@@ -682,7 +682,7 @@ void PrintPreviewHandler::HandleGetPrivetPrinters(const base::ListValue* args) { |
AllowJavascript(); |
if (!PrivetPrintingEnabled()) { |
- RejectJavascriptCallback(base::Value(callback_id), base::Value(false)); |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
} |
#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
using local_discovery::ServiceDiscoverySharedClient; |
@@ -701,20 +701,30 @@ void PrintPreviewHandler::StopPrivetLister() { |
printer_lister_->Stop(); |
} |
ResolveJavascriptCallback(base::Value(privet_callback_id_), base::Value()); |
+ privet_callback_id_ = ""; |
#endif |
} |
void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities( |
const base::ListValue* args) { |
-#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
- std::string name; |
- bool success = args->GetString(0, &name); |
- DCHECK(success); |
+ AllowJavascript(); |
- CreatePrivetHTTP( |
- name, base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient, |
- weak_factory_.GetWeakPtr())); |
+ std::string callback_id; |
+ std::string printer_name; |
+ if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) || |
+ callback_id.empty() || printer_name.empty()) { |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
+ return; |
+ } |
+#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
+ if (CreatePrivetHTTP( |
+ printer_name, |
+ base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient, |
+ weak_factory_.GetWeakPtr(), callback_id))) { |
+ return; |
+ } |
#endif |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
} |
void PrintPreviewHandler::HandleGetExtensionPrinters( |
@@ -747,15 +757,21 @@ void PrintPreviewHandler::HandleGrantExtensionPrinterAccess( |
void PrintPreviewHandler::HandleGetExtensionPrinterCapabilities( |
const base::ListValue* args) { |
- std::string printer_id; |
- bool ok = args->GetString(0, &printer_id); |
- DCHECK(ok); |
+ AllowJavascript(); |
+ |
+ std::string callback_id; |
+ std::string printer_name; |
+ if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) || |
+ callback_id.empty() || printer_name.empty()) { |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
+ return; |
+ } |
EnsureExtensionPrinterHandlerSet(); |
extension_printer_handler_->StartGetCapability( |
- printer_id, |
+ printer_name, |
base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterCapabilities, |
- weak_factory_.GetWeakPtr())); |
+ weak_factory_.GetWeakPtr(), callback_id)); |
} |
void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) { |
@@ -1071,10 +1087,15 @@ void PrintPreviewHandler::HandleSaveAppState(const base::ListValue* args) { |
void PrintPreviewHandler::HandleGetPrinterCapabilities( |
const base::ListValue* args) { |
+ AllowJavascript(); |
+ |
+ std::string callback_id; |
std::string printer_name; |
- bool ret = args->GetString(0, &printer_name); |
- if (!ret || printer_name.empty()) |
+ if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) || |
+ callback_id.empty() || printer_name.empty()) { |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
return; |
+ } |
if (printer_name == kLocalPdfPrinterId) { |
auto printer_info = base::MakeUnique<base::DictionaryValue>(); |
@@ -1082,13 +1103,13 @@ void PrintPreviewHandler::HandleGetPrinterCapabilities( |
printer_info->Set( |
printing::kPrinterCapabilities, |
GetPdfCapabilities(g_browser_process->GetApplicationLocale())); |
- SendPrinterCapabilities(printer_name, std::move(printer_info)); |
+ SendPrinterCapabilities(callback_id, printer_name, std::move(printer_info)); |
return; |
} |
printing::PrinterSetupCallback cb = |
base::Bind(&PrintPreviewHandler::SendPrinterCapabilities, |
- weak_factory_.GetWeakPtr(), printer_name); |
+ weak_factory_.GetWeakPtr(), callback_id, printer_name); |
printer_backend_proxy()->ConfigurePrinterAndFetchCapabilities(printer_name, |
cb); |
@@ -1307,19 +1328,18 @@ void PrintPreviewHandler::SendAccessToken(const std::string& type, |
} |
void PrintPreviewHandler::SendPrinterCapabilities( |
+ const std::string& callback_id, |
const std::string& printer_name, |
std::unique_ptr<base::DictionaryValue> settings_info) { |
// Check that |settings_info| is valid. |
if (settings_info && settings_info->Get("capabilities", nullptr)) { |
VLOG(1) << "Get printer capabilities finished"; |
- web_ui()->CallJavascriptFunctionUnsafe("updateWithPrinterCapabilities", |
- *settings_info); |
+ ResolveJavascriptCallback(base::Value(callback_id), *settings_info); |
return; |
} |
VLOG(1) << "Get printer capabilities failed"; |
- web_ui()->CallJavascriptFunctionUnsafe("failedToGetPrinterCapabilities", |
- base::Value(printer_name)); |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
} |
void PrintPreviewHandler::SendPrinterSetup( |
@@ -1570,21 +1590,30 @@ void PrintPreviewHandler::LocalPrinterCacheFlushed() { |
} |
void PrintPreviewHandler::PrivetCapabilitiesUpdateClient( |
+ const std::string& callback_id, |
std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { |
- if (!PrivetUpdateClient(std::move(http_client))) |
+ if (!PrivetUpdateClient(callback_id, std::move(http_client))) |
return; |
privet_capabilities_operation_ = |
privet_http_client_->CreateCapabilitiesOperation( |
base::Bind(&PrintPreviewHandler::OnPrivetCapabilities, |
- weak_factory_.GetWeakPtr())); |
+ weak_factory_.GetWeakPtr(), callback_id)); |
privet_capabilities_operation_->Start(); |
} |
bool PrintPreviewHandler::PrivetUpdateClient( |
+ const std::string& callback_id, |
std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { |
if (!http_client) { |
- SendPrivetCapabilitiesError(privet_http_resolution_->GetName()); |
+ if (callback_id.empty()) { |
+ // This was an attempt to print to a privet printer and has failed. |
+ base::Value http_code_value(-1); |
+ web_ui()->CallJavascriptFunctionUnsafe("onPrivetPrintFailed", |
+ http_code_value); |
+ } else { // Capabilities update failed |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
+ } |
privet_http_resolution_.reset(); |
return false; |
} |
@@ -1604,7 +1633,7 @@ void PrintPreviewHandler::PrivetLocalPrintUpdateClient( |
std::string capabilities, |
gfx::Size page_size, |
std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { |
- if (!PrivetUpdateClient(std::move(http_client))) |
+ if (!PrivetUpdateClient("", std::move(http_client))) |
return; |
StartPrivetLocalPrint(print_ticket, capabilities, page_size); |
@@ -1645,49 +1674,52 @@ void PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket, |
privet_local_print_operation_->Start(); |
} |
- |
void PrintPreviewHandler::OnPrivetCapabilities( |
+ const std::string& callback_id, |
const base::DictionaryValue* capabilities) { |
std::string name = privet_capabilities_operation_->GetHTTPClient()->GetName(); |
if (!capabilities || capabilities->HasKey(cloud_print::kPrivetKeyError) || |
!printer_lister_) { |
- SendPrivetCapabilitiesError(name); |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
return; |
} |
- base::DictionaryValue printer_info; |
const cloud_print::DeviceDescription* description = |
printer_lister_->GetDeviceDescription(name); |
if (!description) { |
- SendPrivetCapabilitiesError(name); |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
return; |
} |
- FillPrinterDescription(name, *description, true, &printer_info); |
- |
- web_ui()->CallJavascriptFunctionUnsafe("onPrivetCapabilitiesSet", |
- printer_info, *capabilities); |
+ std::unique_ptr<base::DictionaryValue> printer_info = |
+ base::MakeUnique<base::DictionaryValue>(); |
+ FillPrinterDescription(name, *description, true, printer_info.get()); |
+ base::DictionaryValue printer_info_and_caps; |
+ printer_info_and_caps.SetDictionary("printer", std::move(printer_info)); |
+ std::unique_ptr<base::DictionaryValue> capabilities_copy = |
+ capabilities->CreateDeepCopy(); |
+ printer_info_and_caps.SetDictionary("capabilities", |
+ std::move(capabilities_copy)); |
+ ResolveJavascriptCallback(base::Value(callback_id), printer_info_and_caps); |
privet_capabilities_operation_.reset(); |
} |
-void PrintPreviewHandler::SendPrivetCapabilitiesError( |
- const std::string& device_name) { |
- base::Value name_value(device_name); |
- web_ui()->CallJavascriptFunctionUnsafe("failedToGetPrivetPrinterCapabilities", |
- name_value); |
-} |
- |
void PrintPreviewHandler::PrintToPrivetPrinter(const std::string& device_name, |
const std::string& ticket, |
const std::string& capabilities, |
const gfx::Size& page_size) { |
- CreatePrivetHTTP( |
- device_name, |
- base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient, |
- weak_factory_.GetWeakPtr(), ticket, capabilities, page_size)); |
+ if (!CreatePrivetHTTP( |
+ device_name, |
+ base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient, |
+ weak_factory_.GetWeakPtr(), ticket, capabilities, |
+ page_size))) { |
+ base::Value http_code_value(-1); |
+ web_ui()->CallJavascriptFunctionUnsafe("onPrivetPrintFailed", |
+ http_code_value); |
+ } |
} |
bool PrintPreviewHandler::CreatePrivetHTTP( |
@@ -1697,10 +1729,8 @@ bool PrintPreviewHandler::CreatePrivetHTTP( |
const cloud_print::DeviceDescription* device_description = |
printer_lister_ ? printer_lister_->GetDeviceDescription(name) : NULL; |
- if (!device_description) { |
- SendPrivetCapabilitiesError(name); |
+ if (!device_description) |
return false; |
- } |
privet_http_factory_ = |
cloud_print::PrivetHTTPAsynchronousFactory::CreateInstance( |
@@ -1776,16 +1806,13 @@ void PrintPreviewHandler::OnGotExtensionPrinterInfo( |
} |
void PrintPreviewHandler::OnGotExtensionPrinterCapabilities( |
- const std::string& printer_id, |
+ const std::string& callback_id, |
const base::DictionaryValue& capabilities) { |
if (capabilities.empty()) { |
- web_ui()->CallJavascriptFunctionUnsafe( |
- "failedToGetExtensionPrinterCapabilities", base::Value(printer_id)); |
+ RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
return; |
} |
- |
- web_ui()->CallJavascriptFunctionUnsafe("onExtensionCapabilitiesSet", |
- base::Value(printer_id), capabilities); |
+ ResolveJavascriptCallback(base::Value(callback_id), capabilities); |
} |
void PrintPreviewHandler::OnExtensionPrintResult(bool success, |