 Chromium Code Reviews
 Chromium Code Reviews Issue 114533002:
  Chrome Now notificationGroups Storage Race Condition Fix  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 114533002:
  Chrome Now notificationGroups Storage Race Condition Fix  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| 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 1a35d4091e8ca6fc88008580a563cbb16a5ae176..a2782b90144380fc6da14eddebf6abc337f2d2b0 100644 | 
| --- a/chrome/browser/resources/google_now/background.js | 
| +++ b/chrome/browser/resources/google_now/background.js | 
| @@ -293,12 +293,16 @@ function setAuthorization(request, callbackBoolean) { | 
| /** | 
| * Shows parsed and combined cards as notifications. | 
| + * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from | 
| + * group name to group information. | 
| * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from | 
| * chromeNotificationId to the combined card, containing cards to show. | 
| + * @param {function()} onSuccess Called on success. | 
| * @param {function(ReceivedNotification)=} onCardShown Optional parameter | 
| * called when each card is shown. | 
| */ | 
| -function showNotificationCards(cards, onCardShown) { | 
| +function showNotificationCards( | 
| + notificationGroups, cards, onSuccess, onCardShown) { | 
| console.log('showNotificationCards ' + JSON.stringify(cards)); | 
| instrumented.notifications.getAll(function(notifications) { | 
| @@ -320,9 +324,11 @@ function showNotificationCards(cards, onCardShown) { | 
| notificationsData[chromeNotificationId] = cardSet.update( | 
| chromeNotificationId, | 
| cards[chromeNotificationId], | 
| + notificationGroups, | 
| onCardShown); | 
| } | 
| chrome.storage.local.set({notificationsData: notificationsData}); | 
| + onSuccess(); | 
| }); | 
| } | 
| @@ -417,10 +423,12 @@ function scheduleNextPoll(groups, isOptedIn) { | 
| * them. | 
| * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from | 
| * group name to group information. | 
| + * @param {function()} onSuccess Called on success. | 
| * @param {function(ReceivedNotification)=} onCardShown Optional parameter | 
| * called when each card is shown. | 
| */ | 
| -function combineAndShowNotificationCards(notificationGroups, onCardShown) { | 
| +function combineAndShowNotificationCards( | 
| + notificationGroups, onSuccess, onCardShown) { | 
| console.log('combineAndShowNotificationCards ' + | 
| JSON.stringify(notificationGroups)); | 
| /** @type {Object.<ChromeNotificationId, CombinedCard>} */ | 
| @@ -429,7 +437,8 @@ function combineAndShowNotificationCards(notificationGroups, onCardShown) { | 
| for (var groupName in notificationGroups) | 
| combineGroup(combinedCards, notificationGroups[groupName]); | 
| - showNotificationCards(combinedCards, onCardShown); | 
| + showNotificationCards( | 
| + notificationGroups, combinedCards, onSuccess, onCardShown); | 
| } | 
| /** | 
| @@ -531,12 +540,15 @@ function parseAndShowNotificationCards(response, onCardShown) { | 
| } | 
| scheduleNextPoll(updatedGroups, !parsedResponse.googleNowDisabled); | 
| - chrome.storage.local.set({ | 
| - notificationGroups: updatedGroups, | 
| - recentDismissals: updatedRecentDismissals | 
| - }); | 
| - combineAndShowNotificationCards(updatedGroups, onCardShown); | 
| - recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | 
| + combineAndShowNotificationCards(updatedGroups, | 
| 
vadimt
2013/12/13 20:07:40
nit: please start "updatedGroups," from new line
 
robliao
2013/12/13 20:38:17
Done.
 | 
| + function() { | 
| + chrome.storage.local.set({ | 
| + notificationGroups: updatedGroups, | 
| + recentDismissals: updatedRecentDismissals | 
| + }); | 
| + recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | 
| + }, | 
| + onCardShown); | 
| }); | 
| } | 
| @@ -905,42 +917,47 @@ function onNotificationClosed(chromeNotificationId, byUser) { | 
| dismissalAttempts.start(); | 
| instrumented.storage.local.get( | 
| - ['pendingDismissals', 'notificationsData'], function(items) { | 
| - items = items || {}; | 
| - /** @type {Array.<PendingDismissal>} */ | 
| - items.pendingDismissals = items.pendingDismissals || []; | 
| - /** @type {Object.<string, NotificationDataEntry>} */ | 
| - items.notificationsData = items.notificationsData || {}; | 
| - | 
| - /** @type {NotificationDataEntry} */ | 
| - var notificationData = items.notificationsData[chromeNotificationId] || { | 
| - timestamp: Date.now(), | 
| - combinedCard: [] | 
| - }; | 
| - | 
| - var dismissalResult = | 
| - cardSet.onDismissal(chromeNotificationId, notificationData); | 
| - | 
| - for (var i = 0; i < dismissalResult.dismissals.length; i++) { | 
| - /** @type {PendingDismissal} */ | 
| - var dismissal = { | 
| - chromeNotificationId: chromeNotificationId, | 
| - time: Date.now(), | 
| - dismissalData: dismissalResult.dismissals[i] | 
| - }; | 
| - items.pendingDismissals.push(dismissal); | 
| - } | 
| + ['pendingDismissals', 'notificationsData', 'notificationGroups'], | 
| + function(items) { | 
| + items = items || {}; | 
| + /** @type {Array.<PendingDismissal>} */ | 
| + items.pendingDismissals = items.pendingDismissals || []; | 
| + /** @type {Object.<string, NotificationDataEntry>} */ | 
| + items.notificationsData = items.notificationsData || {}; | 
| + /** @type {Object.<string, StoredNotificationGroup>} */ | 
| + items.notificationGroups = items.notificationGroups || {}; | 
| - items.notificationsData[chromeNotificationId] = | 
| - dismissalResult.notificationData; | 
| + /** @type {NotificationDataEntry} */ | 
| + var notificationData = | 
| + items.notificationsData[chromeNotificationId] || | 
| + { | 
| + timestamp: Date.now(), | 
| + combinedCard: [] | 
| + }; | 
| + | 
| + var dismissalResult = | 
| + cardSet.onDismissal( | 
| + chromeNotificationId, | 
| + notificationData, | 
| + items.notificationGroups); | 
| + | 
| + for (var i = 0; i < dismissalResult.dismissals.length; i++) { | 
| + /** @type {PendingDismissal} */ | 
| + var dismissal = { | 
| + chromeNotificationId: chromeNotificationId, | 
| + time: Date.now(), | 
| + dismissalData: dismissalResult.dismissals[i] | 
| + }; | 
| + items.pendingDismissals.push(dismissal); | 
| + } | 
| - chrome.storage.local.set({ | 
| - pendingDismissals: items.pendingDismissals, | 
| - notificationsData: items.notificationsData | 
| - }); | 
| + items.notificationsData[chromeNotificationId] = | 
| + dismissalResult.notificationData; | 
| - processPendingDismissals(function(success) {}); | 
| - }); | 
| + chrome.storage.local.set(items); | 
| + | 
| + processPendingDismissals(function(success) {}); | 
| + }); | 
| }); | 
| } | 
| @@ -1125,7 +1142,7 @@ instrumented.runtime.onStartup.addListener(function() { | 
| /** @type {Object.<string, StoredNotificationGroup>} */ | 
| items.notificationGroups = items.notificationGroups || {}; | 
| - combineAndShowNotificationCards(items.notificationGroups); | 
| + combineAndShowNotificationCards(items.notificationGroups, function() {}); | 
| 
vadimt
2013/12/13 20:07:40
We need to store notificationGroups here too, in c
 
robliao
2013/12/13 20:38:17
Ah. I for some reason thought we didn't need this.
 | 
| }); | 
| }); |