| Index: chrome/browser/resources/google_now/background.js
|
| diff --git a/chrome/browser/resources/google_now/background.js b/chrome/browser/resources/google_now/background.js
|
| index 3c4bf8f5c5e95148f1d39da830bb396fc8de8779..0fdbd6724c10e7292d530e9fbf3dc12adacdf8ec 100644
|
| --- a/chrome/browser/resources/google_now/background.js
|
| +++ b/chrome/browser/resources/google_now/background.js
|
| @@ -53,22 +53,21 @@ var INITIAL_POLLING_PERIOD_SECONDS = 5 * 60; // 5 minutes
|
| */
|
| var MAXIMUM_POLLING_PERIOD_SECONDS = 60 * 60; // 1 hour
|
|
|
| -var UPDATE_NOTIFICATIONS_ALARM_NAME = 'UPDATE';
|
| -
|
| /**
|
| - * Period for retrying the server request for dismissing cards.
|
| + * Initial period for retrying the server request for dismissing cards.
|
| */
|
| -var RETRY_DISMISS_PERIOD_SECONDS = 60; // 1 minute
|
| +var INITIAL_RETRY_DISMISS_PERIOD_SECONDS = 60; // 1 minute
|
|
|
| -var RETRY_DISMISS_ALARM_NAME = 'RETRY_DISMISS';
|
| +/**
|
| + * Maximum period for retrying the server request for dismissing cards.
|
| + */
|
| +var MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS = 60 * 60; // 1 hour
|
|
|
| /**
|
| * Time we keep dismissals after successful server dismiss requests.
|
| */
|
| var DISMISS_RETENTION_TIME_MS = 20 * 60 * 1000; // 20 minutes
|
|
|
| -var storage = chrome.storage.local;
|
| -
|
| /**
|
| * Names for tasks that can be created by the extension.
|
| */
|
| @@ -121,6 +120,17 @@ tasks.instrumentApiFunction(chrome.runtime.onStartup, 'addListener', 0);
|
| tasks.instrumentApiFunction(chrome.tabs, 'create', 1);
|
| tasks.instrumentApiFunction(storage, 'get', 1);
|
|
|
| +var updateCardsAttempts = buildAttemptManager(
|
| + 'cards-update',
|
| + requestLocation,
|
| + INITIAL_POLLING_PERIOD_SECONDS,
|
| + MAXIMUM_POLLING_PERIOD_SECONDS);
|
| +var dismissalAttempts = buildAttemptManager(
|
| + 'dismiss',
|
| + retryPendingDismissals,
|
| + INITIAL_RETRY_DISMISS_PERIOD_SECONDS,
|
| + MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS);
|
| +
|
| /**
|
| * Diagnostic event identifier.
|
| * @enum {number}
|
| @@ -293,13 +303,9 @@ function parseAndShowNotificationCards(response, callback) {
|
| }
|
| }
|
|
|
| - scheduleNextUpdate(parsedResponse.expiration_timestamp_seconds);
|
| + updateCardsAttempts.start(parsedResponse.expiration_timestamp_seconds);
|
|
|
| - // Now that we got a valid response from the server, reset the retry period
|
| - // to the initial value. This retry period will be used the next time we
|
| - // fail to get the server-provided period.
|
| storage.set({
|
| - retryDelaySeconds: INITIAL_POLLING_PERIOD_SECONDS,
|
| activeNotifications: notificationsData,
|
| recentDismissals: updatedRecentDismissals
|
| });
|
| @@ -372,23 +378,7 @@ function updateNotificationsCards(position) {
|
| ' @' + new Date());
|
| tasks.add(UPDATE_CARDS_TASK_NAME, function(callback) {
|
| console.log('updateNotificationsCards-task-begin');
|
| - tasks.debugSetStepName('updateNotificationsCards-get-retryDelaySeconds');
|
| - storage.get('retryDelaySeconds', function(items) {
|
| - console.log('updateNotificationsCards-get-retryDelaySeconds ' +
|
| - JSON.stringify(items));
|
| - // Immediately schedule the update after the current retry period. Then,
|
| - // we'll use update time from the server if available.
|
| - scheduleNextUpdate(items.retryDelaySeconds);
|
| -
|
| - // TODO(vadimt): Consider interrupting waiting for the next update if we
|
| - // detect that the network conditions have changed. Also, decide whether
|
| - // the exponential backoff is needed both when we are offline and when
|
| - // there are failures on the server side.
|
| - var newRetryDelaySeconds =
|
| - Math.min(items.retryDelaySeconds * 2 * (1 + 0.2 * Math.random()),
|
| - MAXIMUM_POLLING_PERIOD_SECONDS);
|
| - storage.set({retryDelaySeconds: newRetryDelaySeconds});
|
| -
|
| + updateCardsAttempts.planForNext(function() {
|
| processPendingDismissals(function(success) {
|
| if (success) {
|
| // The cards are requested only if there are no unsent dismissals.
|
| @@ -460,7 +450,7 @@ function processPendingDismissals(callbackBoolean) {
|
|
|
| function doProcessDismissals() {
|
| if (items.pendingDismissals.length == 0) {
|
| - chrome.alarms.clear(RETRY_DISMISS_ALARM_NAME);
|
| + dismissalAttempts.stop();
|
| onFinish(true);
|
| return;
|
| }
|
| @@ -490,7 +480,9 @@ function processPendingDismissals(callbackBoolean) {
|
| */
|
| function retryPendingDismissals() {
|
| tasks.add(RETRY_DISMISS_TASK_NAME, function(callback) {
|
| - processPendingDismissals(function(success) { callback(); });
|
| + dismissalAttempts.planForNext(function() {
|
| + processPendingDismissals(function(success) { callback(); });
|
| + });
|
| });
|
| }
|
|
|
| @@ -538,15 +530,7 @@ function onNotificationClosed(notificationId, byUser) {
|
| chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed');
|
|
|
| tasks.add(DISMISS_CARD_TASK_NAME, function(callback) {
|
| - // Schedule retrying dismissing until all dismissals go through.
|
| - // TODO(vadimt): Implement exponential backoff and unify it with getting
|
| - // cards.
|
| - var alarmInfo = {
|
| - delayInMinutes: RETRY_DISMISS_PERIOD_SECONDS / 60,
|
| - periodInMinutes: RETRY_DISMISS_PERIOD_SECONDS / 60
|
| - };
|
| -
|
| - chrome.alarms.create(RETRY_DISMISS_ALARM_NAME, alarmInfo);
|
| + dismissalAttempts.start();
|
|
|
| // Deleting the notification in case it was re-added while this task was
|
| // scheduled, waiting for execution.
|
| @@ -568,37 +552,19 @@ function onNotificationClosed(notificationId, byUser) {
|
| }
|
|
|
| /**
|
| - * Schedules next update for notification cards.
|
| - * @param {int} delaySeconds Length of time in seconds after which the alarm
|
| - * event should fire.
|
| - */
|
| -function scheduleNextUpdate(delaySeconds) {
|
| - console.log('scheduleNextUpdate ' + delaySeconds);
|
| - // Schedule an alarm after the specified delay. 'periodInMinutes' is for the
|
| - // case when we fail to re-register the alarm.
|
| - var alarmInfo = {
|
| - delayInMinutes: delaySeconds / 60,
|
| - periodInMinutes: MAXIMUM_POLLING_PERIOD_SECONDS / 60
|
| - };
|
| -
|
| - chrome.alarms.create(UPDATE_NOTIFICATIONS_ALARM_NAME, alarmInfo);
|
| -}
|
| -
|
| -/**
|
| * Initializes the event page on install or on browser startup.
|
| */
|
| function initialize() {
|
| + // Create an update timer for a case when for some reason location request
|
| + // gets stuck.
|
| + updateCardsAttempts.start(MAXIMUM_POLLING_PERIOD_SECONDS);
|
| +
|
| var initialStorage = {
|
| activeNotifications: {},
|
| - recentDismissals: {},
|
| - retryDelaySeconds: INITIAL_POLLING_PERIOD_SECONDS
|
| + recentDismissals: {}
|
| };
|
| storage.set(initialStorage);
|
|
|
| - // Create an update timer for a case when for some reason location request
|
| - // gets stuck.
|
| - scheduleNextUpdate(MAXIMUM_POLLING_PERIOD_SECONDS);
|
| -
|
| requestLocation();
|
| }
|
|
|
| @@ -615,13 +581,6 @@ chrome.runtime.onStartup.addListener(function() {
|
| initialize();
|
| });
|
|
|
| -chrome.alarms.onAlarm.addListener(function(alarm) {
|
| - if (alarm.name == UPDATE_NOTIFICATIONS_ALARM_NAME)
|
| - requestLocation();
|
| - else if (alarm.name == RETRY_DISMISS_ALARM_NAME)
|
| - retryPendingDismissals();
|
| -});
|
| -
|
| chrome.notifications.onClicked.addListener(
|
| function(notificationId) {
|
| chrome.metricsPrivate.recordUserAction('GoogleNow.MessageClicked');
|
|
|