Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: chrome/browser/resources/google_now/background.js

Issue 114533002: Chrome Now notificationGroups Storage Race Condition Fix (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: CR Feedback Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/cards.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..94b019e8df23fc3a0cb13887d0623d7ba3b7ce29 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,16 @@ 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,
+ function() {
+ chrome.storage.local.set({
+ notificationGroups: updatedGroups,
+ recentDismissals: updatedRecentDismissals
+ });
+ recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS);
+ },
+ onCardShown);
});
}
@@ -905,42 +918,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 +1143,9 @@ instrumented.runtime.onStartup.addListener(function() {
/** @type {Object.<string, StoredNotificationGroup>} */
items.notificationGroups = items.notificationGroups || {};
- combineAndShowNotificationCards(items.notificationGroups);
+ combineAndShowNotificationCards(items.notificationGroups, function() {
+ chrome.storage.local.set(items);
+ });
});
});
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/cards.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698