Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview | 6 * @fileoverview |
| 7 * OAuth2 class that handles retrieval/storage of an OAuth2 token. | 7 * OAuth2 class that handles retrieval/storage of an OAuth2 token. |
| 8 * | 8 * |
| 9 * Uses a content script to trampoline the OAuth redirect page back into the | 9 * Uses a content script to trampoline the OAuth redirect page back into the |
| 10 * extension context. This works around the lack of native support for | 10 * extension context. This works around the lack of native support for |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 332 }; | 332 }; |
| 333 | 333 |
| 334 /** | 334 /** |
| 335 * Call myfunc with an access token as the only parameter. | 335 * Call myfunc with an access token as the only parameter. |
| 336 * | 336 * |
| 337 * This will refresh the access token if necessary. If the access token | 337 * This will refresh the access token if necessary. If the access token |
| 338 * cannot be refreshed, an error is thrown. | 338 * cannot be refreshed, an error is thrown. |
| 339 * | 339 * |
| 340 * The access token will remain valid for at least 2 minutes. | 340 * The access token will remain valid for at least 2 minutes. |
| 341 * | 341 * |
| 342 * @param {function(string):void} myfunc | 342 * @param {function(string?):void} myfunc Function to invoke with access token. |
| 343 * Function to invoke with access token. | |
| 344 * @return {void} Nothing. | 343 * @return {void} Nothing. |
| 345 */ | 344 */ |
| 346 remoting.OAuth2.prototype.callWithToken = function(myfunc) { | 345 remoting.OAuth2.prototype.callWithToken = function(myfunc) { |
| 347 /** @type {remoting.OAuth2} */ | 346 try { |
| 348 var that = this; | 347 myfunc(this.getAccessToken()); |
|
simonmorris
2012/04/25 16:59:41
If myfunc throws an exception, the following code
Jamie
2012/04/25 17:29:09
As discussed off-line, it's makes the test less ra
| |
| 349 if (remoting.oauth2.needsNewAccessToken()) { | 348 } catch (err) { |
| 350 remoting.oauth2.refreshAccessToken(function() { | 349 /** @type {remoting.OAuth2} */ |
| 351 if (remoting.oauth2.needsNewAccessToken()) { | 350 var that = this; |
| 352 // If we still need it, we're going to infinite loop. | 351 var onRefresh = function() { |
| 353 throw 'Unable to get access token.'; | 352 try { |
| 353 myfunc(that.getAccessToken()); | |
| 354 } catch (err) { | |
| 355 myfunc(null); | |
| 354 } | 356 } |
| 355 myfunc(that.getAccessToken()); | 357 }; |
| 356 }); | 358 remoting.oauth2.refreshAccessToken(onRefresh); |
| 357 return; | |
| 358 } | 359 } |
| 359 | |
| 360 myfunc(this.getAccessToken()); | |
| 361 }; | 360 }; |
| 362 | 361 |
| 363 /** | 362 /** |
| 364 * Get the user's email address. | 363 * Get the user's email address. |
| 365 * | 364 * |
| 366 * @param {function(?string):void} setEmail Callback invoked when the email | 365 * @param {function(?string):void} setEmail Callback invoked when the email |
| 367 * address is available, or on error. | 366 * address is available, or on error. |
| 368 * @return {void} Nothing. | 367 * @return {void} Nothing. |
| 369 */ | 368 */ |
| 370 remoting.OAuth2.prototype.getEmail = function(setEmail) { | 369 remoting.OAuth2.prototype.getEmail = function(setEmail) { |
| 371 /** @type {remoting.OAuth2} */ | 370 /** @type {remoting.OAuth2} */ |
| 372 var that = this; | 371 var that = this; |
| 373 /** @param {XMLHttpRequest} xhr The XHR response. */ | 372 /** @param {XMLHttpRequest} xhr The XHR response. */ |
| 374 var onResponse = function(xhr) { | 373 var onResponse = function(xhr) { |
| 375 that.email = null; | 374 that.email = null; |
| 376 if (xhr.status == 200) { | 375 if (xhr.status == 200) { |
| 377 // TODO(ajwong): See if we can't find a JSON endpoint. | 376 // TODO(ajwong): See if we can't find a JSON endpoint. |
| 378 that.email = xhr.responseText.split('&')[0].split('=')[1]; | 377 that.email = xhr.responseText.split('&')[0].split('=')[1]; |
| 379 } | 378 } |
| 380 window.localStorage.setItem(that.KEY_EMAIL_, that.email); | 379 window.localStorage.setItem(that.KEY_EMAIL_, that.email); |
| 381 setEmail(that.email); | 380 setEmail(that.email); |
| 382 }; | 381 }; |
| 383 | 382 |
| 384 /** @param {string} token The access token. */ | 383 /** @param {string?} token The access token. */ |
| 385 var getEmailFromToken = function(token) { | 384 var getEmailFromToken = function(token) { |
| 386 var headers = { 'Authorization': 'OAuth ' + token }; | 385 if (token) { |
| 387 // TODO(ajwong): Update to new v2 API. | 386 var headers = { 'Authorization': 'OAuth ' + token }; |
| 388 remoting.xhr.get('https://www.googleapis.com/userinfo/email', | 387 // TODO(ajwong): Update to new v2 API. |
| 389 onResponse, '', headers); | 388 remoting.xhr.get('https://www.googleapis.com/userinfo/email', |
| 389 onResponse, '', headers); | |
| 390 } else { | |
| 391 setEmail(null); | |
| 392 } | |
| 390 }; | 393 }; |
| 391 | 394 |
| 392 this.callWithToken(getEmailFromToken); | 395 this.callWithToken(getEmailFromToken); |
| 393 }; | 396 }; |
| 394 | 397 |
| 395 /** | 398 /** |
| 396 * If the user's email address is cached, return it, otherwise return null. | 399 * If the user's email address is cached, return it, otherwise return null. |
| 397 * | 400 * |
| 398 * @return {?string} The email address, if it has been cached by a previous call | 401 * @return {?string} The email address, if it has been cached by a previous call |
| 399 * to getEmail, otherwise null. | 402 * to getEmail, otherwise null. |
| 400 */ | 403 */ |
| 401 remoting.OAuth2.prototype.getCachedEmail = function() { | 404 remoting.OAuth2.prototype.getCachedEmail = function() { |
| 402 var value = window.localStorage.getItem(this.KEY_EMAIL_); | 405 var value = window.localStorage.getItem(this.KEY_EMAIL_); |
| 403 if (typeof value == 'string') { | 406 if (typeof value == 'string') { |
| 404 return value; | 407 return value; |
| 405 } | 408 } |
| 406 return null; | 409 return null; |
| 407 }; | 410 }; |
| OLD | NEW |