Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7684)

Unified Diff: chrome/browser/ui/webui/print_preview/print_preview_handler.cc

Issue 14093016: Native api to get OAuth2 access tokens in Print Preview Web UI. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/print_preview/print_preview_handler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 789926076d2c25b0fb33fb7ce391cc6170e0a67f..bc8745c2fc9f22e6c509e25dbe591665f01e7158 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -35,6 +35,8 @@
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/printing/printer_manager_dialog.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/oauth2_token_service.h"
+#include "chrome/browser/signin/oauth2_token_service_factory.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
@@ -76,6 +78,9 @@ using printing::Metafile;
namespace {
+// The cloud print OAuth2 scope.
+const char kCloudPrintAuth[] = "https://www.googleapis.com/auth/cloudprint";
+
enum UserActionBuckets {
PRINT_TO_PRINTER,
PRINT_TO_PDF,
@@ -236,6 +241,77 @@ static base::LazyInstance<printing::StickySettings> sticky_settings =
} // namespace
+class PrintPreviewHandler::AccessTokenService
+ : public OAuth2TokenService::Consumer {
+ public:
+ typedef const base::Callback<void(const std::string&,
+ const std::string&)> CompleteonCallback;
+
+ explicit AccessTokenService(const CompleteonCallback& callback)
+ : callback_(callback) {
+ }
+
+ void AddOAuth2TokenService(const std::string& type,
+ OAuth2TokenService* service) {
+ services_.push_back(make_linked_ptr(new Service()));
+ services_.back()->type = type;
+ services_.back()->service = service;
+ }
+
+ void RequestToken(const std::string& type) {
+ for (Services::iterator i = services_.begin();
+ i != services_.end(); ++i) {
+ Service& service = **i;
+ if (service.type == type) {
+ if (service.request) // Already in progress.
+ return;
+ OAuth2TokenService::ScopeSet oauth_scopes;
+ oauth_scopes.insert(kCloudPrintAuth);
+ service.request = service.service->StartRequest(oauth_scopes, this);
+ return;
+ }
+ }
+ callback_.Run(type, std::string()); // Unknown type.
+ }
+
+ void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
+ const std::string& access_token,
+ const base::Time& expiration_time) OVERRIDE {
+ OnServiceResponce(request, access_token);
+ }
+
+ void OnGetTokenFailure(const OAuth2TokenService::Request* request,
+ const GoogleServiceAuthError& error) OVERRIDE {
+ OnServiceResponce(request, std::string());
+ }
+
+ private:
+ void OnServiceResponce(const OAuth2TokenService::Request* request,
+ const std::string& access_token) {
+ for (Services::iterator i = services_.begin();
+ i != services_.end(); ++i) {
+ Service& service = **i;
+ if (service.request == request) {
+ service.request.reset();
+ callback_.Run(service.type, access_token);
+ return;
+ }
+ }
+ NOTREACHED();
+ }
+
+ struct Service {
+ std::string type;
+ OAuth2TokenService* service;
+ scoped_ptr<OAuth2TokenService::Request> request;
+ };
+ typedef std::vector<linked_ptr<Service> > Services;
+ Services services_;
+ CompleteonCallback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(AccessTokenService);
+};
+
// static
printing::StickySettings* PrintPreviewHandler::GetStickySettings() {
return sticky_settings.Pointer();
@@ -275,6 +351,9 @@ void PrintPreviewHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback("signIn",
base::Bind(&PrintPreviewHandler::HandleSignin,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback("getAccessToken",
+ base::Bind(&PrintPreviewHandler::HandleGetAccessToken,
+ base::Unretained(this)));
web_ui()->RegisterMessageCallback("manageCloudPrinters",
base::Bind(&PrintPreviewHandler::HandleManageCloudPrint,
base::Unretained(this)));
@@ -585,6 +664,29 @@ void PrintPreviewHandler::HandleSignin(const ListValue* /*args*/) {
base::Bind(&PrintPreviewHandler::OnSigninComplete, AsWeakPtr()));
}
+void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
+ std::string type;
+ if (!args->GetString(0, &type))
+ return;
+ if (!token_service_)
+ InitTokenService();
+ token_service_->RequestToken(type);
+}
+
+void PrintPreviewHandler::InitTokenService() {
+ token_service_.reset(
+ new AccessTokenService(base::Bind(&PrintPreviewHandler::SendAccessToken,
+ base::Unretained(this))));
+ Profile* profile = Profile::FromWebUI(web_ui());
+ OAuth2TokenService* profile_service =
+ OAuth2TokenServiceFactory::GetForProfile(profile);
+ if (profile_service) {
+ token_service_->AddOAuth2TokenService("profile", profile_service);
+ // TODO(vitalybuka): Replace with source of device tokens.
+ token_service_->AddOAuth2TokenService("device", profile_service);
+ }
+}
+
void PrintPreviewHandler::PrintWithCloudPrintDialog(
const base::RefCountedBytes* data,
const string16& title) {
@@ -783,6 +885,13 @@ void PrintPreviewHandler::ClosePreviewDialog() {
print_preview_ui->OnClosePrintPreviewDialog();
}
+void PrintPreviewHandler::SendAccessToken(const std::string& type,
+ const std::string& access_token) {
+ VLOG(1) << "Get getAccessToken finished";
+ web_ui()->CallJavascriptFunction("onDidGetAccessToken", StringValue(type),
+ StringValue(access_token));
+}
+
void PrintPreviewHandler::SendPrinterCapabilities(
const DictionaryValue& settings_info) {
VLOG(1) << "Get printer capabilities finished";
« no previous file with comments | « chrome/browser/ui/webui/print_preview/print_preview_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698