summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobliao@chromium.org <robliao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-28 21:57:10 +0000
committerrobliao@chromium.org <robliao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-28 21:57:10 +0000
commitd377e99187b1ab905c8ceff7e3e0fdcf9e4f2cb3 (patch)
treeeac7ff74edbf2e24ea4b938656b67abdeb48e1e8
parent17ea0ae233fa0deef9df089ccfdf3b0760e8d015 (diff)
downloadchromium_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.js62
-rw-r--r--chrome/browser/resources/google_now/utility.js17
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 {