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

Unified Diff: chrome/browser/resources/google_now/utility.js

Issue 21235008: Authentication Manager for Google Now (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@GeoSM-Diag
Patch Set: Created 7 years, 5 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
Index: chrome/browser/resources/google_now/utility.js
diff --git a/chrome/browser/resources/google_now/utility.js b/chrome/browser/resources/google_now/utility.js
index 309ee57e0f2daf1c5c30b3c4f013cdb291d15886..4d9019e80a91d058e48742f0f1fcdf851274f568 100644
--- a/chrome/browser/resources/google_now/utility.js
+++ b/chrome/browser/resources/google_now/utility.js
@@ -283,6 +283,8 @@ function buildTaskManager(areConflicting) {
}
instrumentApiFunction(chrome.alarms.onAlarm, 'addListener', 0);
+ instrumentApiFunction(chrome.identity, 'getAuthToken', 1);
vadimt 2013/07/30 23:27:23 We instrument only functions with callbacks that a
robliao 2013/07/30 23:58:03 Done.
+ instrumentApiFunction(chrome.identity, 'removeCachedAuthToken', 1);
instrumentApiFunction(chrome.runtime.onSuspend, 'addListener', 0);
chrome.runtime.onSuspend.addListener(function() {
@@ -413,3 +415,94 @@ function buildAttemptManager(
};
}
+/**
+ * Wraps chrome.identity to provide limited listening support for
+ * the sign in state by polling periodically for the auth token.
+ * @return {object} The Authentication Manager interface.
vadimt 2013/07/30 23:27:23 {Object}
robliao 2013/07/30 23:58:03 Done.
+ */
+function buildAuthenticationManager() {
+ var alarmName = 'sign-in-alarm';
+
+ // Holds callbacks for calls to isSignedIn.
+ // Multiple calls to isSignedIn are possible while getAuthToken is
+ // returning back to us. Queue up the callbacks so that only
+ // one call to getAuthToken is required.
+ var isSignedInRequests = [];
vadimt 2013/07/30 23:27:23 Do we queue them for perf reasons? If so, no need
robliao 2013/07/30 23:58:03 Sounds good then. On 2013/07/30 23:27:23, vadimt
+
+ /**
+ * Determines if the user is signed in and provides a token if signed in.
+ * @param {function(boolean, string)} onSuccess Called on completion.
vadimt 2013/07/30 23:27:23 It's called even when getAuthToken fails, therefor
robliao 2013/07/30 23:58:03 In our case, getAuthToken can fail and we treat th
vadimt 2013/07/31 02:29:49 But onSuccess implies there is onFailure. If it's
robliao 2013/07/31 14:46:24 sgtm On 2013/07/31 02:29:49, vadimt wrote:
+ * The boolean is true if the user is signed in, false otherwise.
+ * If the user is signed in, the string contains the token.
+ */
+ function isSignedIn(onSuccess) {
+ isSignedInRequests.push(onSuccess);
+ if (isSignedInRequests.length == 1) {
+ chrome.identity.getAuthToken({interactive: false}, function(token) {
+ var signedIn = !chrome.runtime.lastError && !!token;
+ isSignedInRequests.forEach(function(queuedCallback) {
+ queuedCallback(signedIn, token);
vadimt 2013/07/30 23:27:23 It would be enough to simply pass token. If it's u
robliao 2013/07/30 23:58:03 This was done to remove all of the !!'s that were
vadimt 2013/07/31 02:29:49 But what you essentially do is passing a value and
robliao 2013/07/31 14:46:24 Done.
+ });
+ isSignedInRequests = [];
+ checkAndNotifyListeners(signedIn);
+ });
+ }
+ }
+
+ /**
+ * Removes the specified cached token.
+ * @param {string} token Authentication Token to remove from the cache.
+ * @param {function} onSuccess Called on completion.
+ */
+ function removeToken(token, onSuccess) {
+ chrome.identity.removeCachedAuthToken({token: token}, function() {
+ // Removing the token from the cache will change the sign in state.
+ // Repoll now to check the state and notify listeners.
+ // This also lets Chrome now about a possible problem with the token.
+ isSignedIn(function() {});
+ onSuccess();
+ });
+ }
+
+ var listeners = [];
vadimt 2013/07/30 23:27:23 Please add a TODO item to get rid of this and impl
robliao 2013/07/30 23:58:03 Done.
+
+ /**
+ * Registers a listener that gets called back when the signed in state
+ * is found to be changed.
+ * @param {function} callback Called when the answer to isSignedIn changes.
+ */
+ function addListener(callback) {
+ listeners.push(callback);
+ }
+
+ // Tracks the last answer of isSignedIn and is intentionally initialized
+ // to undefined. checkAndNotifyListeners will not notify the listeners if
+ // this is undefined because technically, no sign in state change occurred.
+ var lastReturnedSignedInState;
vadimt 2013/07/30 23:27:23 Please explicitly assign null. No reasons to use u
robliao 2013/07/30 23:58:03 Done.
+
+ function checkAndNotifyListeners(currentSignedInState) {
+ if ((lastReturnedSignedInState != currentSignedInState) &&
+ (lastReturnedSignedInState != undefined)) {
vadimt 2013/07/30 23:27:23 Please use !== to not deal with JS strangeness.
robliao 2013/07/30 23:58:03 Done.
+ for (var listenerIndex in listeners) {
+ listeners[listenerIndex]();
+ }
+ }
+ lastReturnedSignedInState = currentSignedInState;
+ }
+
+ chrome.alarms.onAlarm.addListener(function(alarm) {
+ if (alarm.name == alarmName) {
+ isSignedIn(function() {});
+ }
+ });
+
+ // Poll for the sign in state every hour.
+ // One hour is just an arbitrary amount of time chosen.
+ chrome.alarms.create(alarmName, {periodInMinutes: 60});
+
+ return {
+ addListener: addListener,
+ isSignedIn: isSignedIn,
+ removeToken: removeToken
+ };
+}

Powered by Google App Engine
This is Rietveld 408576698