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 b91391118ed659597f86e607c41da24dcbebcc54..f5ccf80ce5eb67b1697e525c43980d212590fbdb 100644 |
--- a/chrome/browser/resources/google_now/utility.js |
+++ b/chrome/browser/resources/google_now/utility.js |
@@ -323,7 +323,7 @@ var wrapper = (function() { |
wrapperPluginInstance.prologue(); |
// Call the original callback. |
- callback.apply(null, arguments); |
+ var returnValue = callback.apply(null, arguments); |
if (wrapperPluginInstance) |
wrapperPluginInstance.epilogue(); |
@@ -331,6 +331,8 @@ var wrapper = (function() { |
verify(isInWrappedCallback, |
'Instrumented callback is not instrumented upon exit'); |
isInWrappedCallback = false; |
+ |
+ return returnValue; |
} catch (error) { |
reportError(error); |
} |
@@ -434,6 +436,7 @@ wrapper.instrumentChromeApiFunction('alarms.onAlarm.addListener', 0); |
wrapper.instrumentChromeApiFunction('identity.getAuthToken', 1); |
wrapper.instrumentChromeApiFunction('identity.onSignInChanged.addListener', 0); |
wrapper.instrumentChromeApiFunction('identity.removeCachedAuthToken', 1); |
+wrapper.instrumentChromeApiFunction('storage.local.get', 1); |
wrapper.instrumentChromeApiFunction('webstorePrivate.getBrowserLogin', 0); |
/** |
@@ -569,7 +572,7 @@ function registerPromiseAdapter() { |
var handler = wrapper.wrapCallback(function() { |
if (sameTracker.callbacks) { |
clearTracker(otherTracker); |
- maybeCallback.apply(null, arguments); |
+ return maybeCallback.apply(null, arguments); |
} |
}, false); |
sameTracker.callbacks.push(handler); |
@@ -619,6 +622,43 @@ function registerPromiseAdapter() { |
registerPromiseAdapter(); |
/** |
+ * Control promise rejection. |
+ * @enum {number} |
+ */ |
+var PromiseRejection = { |
+ /** Disallow promise rejection */ |
+ DISALLOW: 0, |
+ /** Allow promise rejection */ |
+ ALLOW: 1 |
+}; |
+ |
+/** |
+ * Provides the promise equivalent of instrumented.storage.local.get. |
+ * @param {Object} defaultStorageObject Default storage object to fill. |
+ * @param {PromiseRejection=} opt_allowPromiseRejection If |
+ * PromiseRejection.ALLOW, allow promise rejection on errors, otherwise the |
+ * default storage object is resolved. |
+ * @return {Promise} A promise that fills the default storage object. On |
+ * failure, if promise rejection is allowed, the promise is rejected, |
+ * otherwise it is resolved to the default storage object. |
+ */ |
+function fillFromChromeLocalStorage( |
+ defaultStorageObject, |
+ opt_allowPromiseRejection) { |
+ return new Promise(function(resolve, reject) { |
+ instrumented.storage.local.get(defaultStorageObject, function(items) { |
+ if (items) { |
+ resolve(items); |
+ } else if (opt_allowPromiseRejection === PromiseRejection.ALLOW) { |
+ reject(); |
+ } else { |
+ resolve(defaultStorageObject); |
+ } |
+ }); |
+ }); |
+} |
+ |
+/** |
* Builds the object to manage tasks (mutually exclusive chains of events). |
* @param {function(string, string): boolean} areConflicting Function that |
* checks if a new task can't be added to a task queue that contains an |
@@ -859,15 +899,17 @@ function buildAttemptManager( |
* the planning is done. |
*/ |
function planForNext(callback) { |
- instrumented.storage.local.get(currentDelayStorageKey, function(items) { |
- if (!items) { |
- items = {}; |
- items[currentDelayStorageKey] = maximumDelaySeconds; |
- } |
- console.log('planForNext-get-storage ' + JSON.stringify(items)); |
- scheduleNextAttempt(items[currentDelayStorageKey]); |
- callback(); |
- }); |
+ var request = {}; |
+ request[currentDelayStorageKey] = undefined; |
+ fillFromChromeLocalStorage(request, PromiseRejection.ALLOW) |
+ .catch(function() { |
+ request[currentDelayStorageKey] = maximumDelaySeconds; |
+ return Promise.resolve(request); |
+ }).then(function(items) { |
+ console.log('planForNext-get-storage ' + JSON.stringify(items)); |
+ scheduleNextAttempt(items[currentDelayStorageKey]); |
+ callback(); |
+ }); |
} |
instrumented.alarms.onAlarm.addListener(function(alarm) { |
@@ -957,17 +999,17 @@ function buildAuthenticationManager() { |
*/ |
function checkAndNotifyListeners() { |
isSignedIn().then(function(signedIn) { |
- instrumented.storage.local.get('lastSignedInState', function(items) { |
- items = items || {}; |
- if (items.lastSignedInState != signedIn) { |
- chrome.storage.local.set( |
- {lastSignedInState: signedIn}); |
- listeners.forEach(function(callback) { |
- callback(); |
- }); |
- } |
+ fillFromChromeLocalStorage({lastSignedInState: undefined}) |
+ .then(function(items) { |
+ if (items.lastSignedInState != signedIn) { |
+ chrome.storage.local.set( |
+ {lastSignedInState: signedIn}); |
+ listeners.forEach(function(callback) { |
+ callback(); |
+ }); |
+ } |
+ }); |
}); |
- }); |
} |
instrumented.identity.onSignInChanged.addListener(function() { |