Chromium Code Reviews| 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 b4ceb816e49a79177a1e882ae57422e66f952db4..10297ab43ea5517c87fa3adb2de1aa04546cebdd 100644 |
| --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
| +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
| @@ -476,9 +476,11 @@ class PrintPreviewHandler::AccessTokenService |
| handler_(handler) { |
| } |
| - void RequestToken(const std::string& type) { |
| - if (requests_.find(type) != requests_.end()) |
| + void RequestToken(const std::string& type, const std::string& callback_id) { |
| + if (requests_.find(type) != requests_.end()) { |
| + handler_->SendRequestInProgress(callback_id); |
| return; // Already in progress. |
| + } |
| OAuth2TokenService* service = NULL; |
| std::string account_id; |
| @@ -507,29 +509,32 @@ class PrintPreviewHandler::AccessTokenService |
| std::unique_ptr<OAuth2TokenService::Request> request( |
| service->StartRequest(account_id, oauth_scopes, this)); |
| requests_[type] = std::move(request); |
| + callbacks_[type] = callback_id; |
| } else { |
| - handler_->SendAccessToken(type, std::string()); // Unknown type. |
| + // Unknown type. |
| + handler_->SendAccessToken(callback_id, std::string()); |
| } |
| } |
| void OnGetTokenSuccess(const OAuth2TokenService::Request* request, |
| const std::string& access_token, |
| const base::Time& expiration_time) override { |
| - OnServiceResponce(request, access_token); |
| + OnServiceResponse(request, access_token); |
| } |
| void OnGetTokenFailure(const OAuth2TokenService::Request* request, |
| const GoogleServiceAuthError& error) override { |
| - OnServiceResponce(request, std::string()); |
| + OnServiceResponse(request, std::string()); |
| } |
| private: |
| - void OnServiceResponce(const OAuth2TokenService::Request* request, |
| + void OnServiceResponse(const OAuth2TokenService::Request* request, |
| const std::string& access_token) { |
| for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) { |
| if (i->second.get() == request) { |
| - handler_->SendAccessToken(i->first, access_token); |
| + handler_->SendAccessToken(callbacks_[i->first], access_token); |
| requests_.erase(i); |
| + callbacks_.erase(i->first); |
| return; |
| } |
| } |
| @@ -539,6 +544,8 @@ class PrintPreviewHandler::AccessTokenService |
| using Requests = |
| std::map<std::string, std::unique_ptr<OAuth2TokenService::Request>>; |
| Requests requests_; |
| + using Callbacks = std::map<std::string, std::string>; |
| + Callbacks callbacks_; |
| PrintPreviewHandler* handler_; |
| DISALLOW_COPY_AND_ASSIGN(AccessTokenService); |
| @@ -745,14 +752,19 @@ void PrintPreviewHandler::HandleGetExtensionPrinters( |
| void PrintPreviewHandler::HandleGrantExtensionPrinterAccess( |
| const base::ListValue* args) { |
| + std::string callback_id; |
| std::string printer_id; |
| - bool ok = args->GetString(0, &printer_id); |
| + bool ok = args->GetString(0, &callback_id) && args->GetString(1, &printer_id); |
| DCHECK(ok); |
| + AllowJavascript(); |
| + if (callback_id.empty() || printer_id.empty()) |
| + RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
| + |
| EnsureExtensionPrinterHandlerSet(); |
| extension_printer_handler_->StartGrantPrinterAccess( |
| printer_id, base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterInfo, |
| - weak_factory_.GetWeakPtr(), printer_id)); |
| + weak_factory_.GetWeakPtr(), callback_id)); |
| } |
| void PrintPreviewHandler::HandleGetExtensionPrinterCapabilities( |
| @@ -1154,12 +1166,18 @@ void PrintPreviewHandler::HandleSignin(const base::ListValue* args) { |
| } |
| void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) { |
| + std::string callback_id; |
| std::string type; |
| - if (!args->GetString(0, &type)) |
| + |
| + AllowJavascript(); |
| + if (!args->GetString(0, &callback_id) || !args->GetString(1, &type)) { |
|
dpapad
2017/06/15 22:20:13
Can this happen other than programmer's error? Sho
rbpotter
2017/06/16 02:19:36
Done.
|
| + RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
| return; |
| + } |
| + |
| if (!token_service_) |
| token_service_ = base::MakeUnique<AccessTokenService>(this); |
| - token_service_->RequestToken(type); |
| + token_service_->RequestToken(type, callback_id); |
| } |
| void PrintPreviewHandler::HandleManageCloudPrint( |
| @@ -1318,11 +1336,21 @@ void PrintPreviewHandler::ClosePreviewDialog() { |
| print_preview_ui()->OnClosePrintPreviewDialog(); |
| } |
| -void PrintPreviewHandler::SendAccessToken(const std::string& type, |
| +void PrintPreviewHandler::SendAccessToken(const std::string& callback_id, |
| const std::string& access_token) { |
| VLOG(1) << "Get getAccessToken finished"; |
| - web_ui()->CallJavascriptFunctionUnsafe( |
| - "onDidGetAccessToken", base::Value(type), base::Value(access_token)); |
| + base::DictionaryValue response; |
| + response.SetBoolean("completed", true); |
| + response.SetString("accessToken", access_token); |
| + ResolveJavascriptCallback(base::Value(callback_id), response); |
| +} |
| + |
| +void PrintPreviewHandler::SendRequestInProgress( |
| + const std::string& callback_id) { |
| + base::DictionaryValue response; |
| + response.SetBoolean("completed", false); |
| + response.SetString("accessToken", ""); |
| + ResolveJavascriptCallback(base::Value(callback_id), response); |
| } |
| void PrintPreviewHandler::SendPrinterCapabilities( |
| @@ -1783,16 +1811,13 @@ void PrintPreviewHandler::OnGotPrintersForExtension( |
| } |
| void PrintPreviewHandler::OnGotExtensionPrinterInfo( |
| - const std::string& printer_id, |
| + const std::string& callback_id, |
| const base::DictionaryValue& printer_info) { |
| if (printer_info.empty()) { |
| - web_ui()->CallJavascriptFunctionUnsafe("failedToResolveProvisionalPrinter", |
| - base::Value(printer_id)); |
| + RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
| return; |
| } |
| - |
| - web_ui()->CallJavascriptFunctionUnsafe("onProvisionalPrinterResolved", |
| - base::Value(printer_id), printer_info); |
| + ResolveJavascriptCallback(base::Value(callback_id), printer_info); |
| } |
| void PrintPreviewHandler::OnGotExtensionPrinterCapabilities( |