diff options
author | robliao@chromium.org <robliao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-28 21:57:10 +0000 |
---|---|---|
committer | robliao@chromium.org <robliao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-28 21:57:10 +0000 |
commit | d377e99187b1ab905c8ceff7e3e0fdcf9e4f2cb3 (patch) | |
tree | eac7ff74edbf2e24ea4b938656b67abdeb48e1e8 | |
parent | 17ea0ae233fa0deef9df089ccfdf3b0760e8d015 (diff) | |
download | chromium_src-d377e99187b1ab905c8ceff7e3e0fdcf9e4f2cb3.zip chromium_src-d377e99187b1ab905c8ceff7e3e0fdcf9e4f2cb3.tar.gz chromium_src-d377e99187b1ab905c8ceff7e3e0fdcf9e4f2cb3.tar.bz2 |
Add Optin Retry Logic to Google Now
Bonus Fix:
fillFromChromeLocalStorage now handles undefined defaults correctly.
BUG=353703
R=rgustafson@chromium.org, skare@chromium.org, xiyuan@chromium.org
Review URL: https://codereview.chromium.org/217263005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260294 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/google_now/background.js | 62 | ||||
-rw-r--r-- | chrome/browser/resources/google_now/utility.js | 17 |
2 files changed, 76 insertions, 3 deletions
diff --git a/chrome/browser/resources/google_now/background.js b/chrome/browser/resources/google_now/background.js index f5ddd23..de13096 100644 --- a/chrome/browser/resources/google_now/background.js +++ b/chrome/browser/resources/google_now/background.js @@ -52,6 +52,19 @@ var MINIMUM_POLLING_PERIOD_SECONDS = 5 * 60; // 5 minutes var MAXIMUM_POLLING_PERIOD_SECONDS = 60 * 60; // 1 hour /** + * Initial period for polling for Google Now optin notification after push + * messaging indicates Google Now is enabled. + */ +var INITIAL_OPTIN_POLLING_PERIOD_SECONDS = 60; // 1 minute + +/** + * Maximum period for polling for Google Now optin notification after push + * messaging indicates Google Now is enabled. It is expected that the alarm + * will be stopped after this. + */ +var MAXIMUM_OPTIN_POLLING_PERIOD_SECONDS = 16 * 60; // 16 minutes + +/** * Initial period for retrying the server request for dismissing cards. */ var INITIAL_RETRY_DISMISS_PERIOD_SECONDS = 60; // 1 minute @@ -202,6 +215,11 @@ var updateCardsAttempts = buildAttemptManager( requestCards, INITIAL_POLLING_PERIOD_SECONDS, MAXIMUM_POLLING_PERIOD_SECONDS); +var optInCheckAttempts = buildAttemptManager( + 'optin', + pollOptedIn, + INITIAL_OPTIN_POLLING_PERIOD_SECONDS, + MAXIMUM_OPTIN_POLLING_PERIOD_SECONDS); var dismissalAttempts = buildAttemptManager( 'dismiss', retryPendingDismissals, @@ -1096,6 +1114,48 @@ function isGoogleNowEnabled() { }); } +/** + * Polls the optin state. + * Sometimes we get the response to the opted in result too soon during + * push messaging. We'll recheck the optin state a few times before giving up. + */ +function pollOptedIn() { + /** + * Cleans up any state used to recheck the opt-in poll. + */ + function clearPollingState() { + localStorage.removeItem('optedInCheckCount'); + optInCheckAttempts.stop(); + } + + /** + * Performs the actual work for checking the opt-in state and requesting cards + * on opted-in. + */ + function checkOptedIn() { + // Limit retries to 5. + if (localStorage.optedInCheckCount < 5) { + console.log(new Date() + + ' checkOptedIn Attempt ' + localStorage.optedInCheckCount); + localStorage.optedInCheckCount++; + requestOptedIn(function() { + clearPollingState(); + requestCards(); + }); + } else { + clearPollingState(); + } + } + + if (localStorage.optedInCheckCount === undefined) { + localStorage.optedInCheckCount = 0; + optInCheckAttempts.start(); + checkOptedIn(); + } else { + optInCheckAttempts.planForNext(checkOptedIn); + } +} + instrumented.runtime.onInstalled.addListener(function(details) { console.log('onInstalled ' + JSON.stringify(details)); if (details.reason != 'chrome_update') { @@ -1202,7 +1262,7 @@ instrumented.pushMessaging.onMessage.addListener(function(message) { notificationGroups: items.notificationGroups }); - requestCards(); + pollOptedIn(); } }); }); diff --git a/chrome/browser/resources/google_now/utility.js b/chrome/browser/resources/google_now/utility.js index d91bd68..c67a370 100644 --- a/chrome/browser/resources/google_now/utility.js +++ b/chrome/browser/resources/google_now/utility.js @@ -648,9 +648,22 @@ function fillFromChromeLocalStorage( defaultStorageObject, opt_allowPromiseRejection) { return new Promise(function(resolve, reject) { - instrumented.storage.local.get(defaultStorageObject, function(items) { + // We have to create a keys array because keys with a default value + // of undefined will cause that key to not be looked up! + var keysToGet = []; + for (var key in defaultStorageObject) { + keysToGet.push(key); + } + instrumented.storage.local.get(keysToGet, function(items) { if (items) { - resolve(items); + // Merge the result with the default storage object to ensure all keys + // requested have either the default value or the retrieved storage + // value. + var result = {}; + for (var key in defaultStorageObject) { + result[key] = (key in items) ? items[key] : defaultStorageObject[key]; + } + resolve(result); } else if (opt_allowPromiseRejection === PromiseRejection.ALLOW) { reject(); } else { |