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 1b7ba8503a6ccd2396f132d19eaeca0ff081a5e9..0d8de446b052525c584f95529db8ccefd22915d8 100644 |
--- a/chrome/browser/resources/google_now/background.js |
+++ b/chrome/browser/resources/google_now/background.js |
@@ -81,10 +81,17 @@ var DISMISS_CARD_TASK_NAME = 'dismiss-card'; |
var RETRY_DISMISS_TASK_NAME = 'retry-dismiss'; |
var STATE_CHANGED_TASK_NAME = 'state-changed'; |
var SHOW_ON_START_TASK_NAME = 'show-cards-on-start'; |
+var ON_PUSH_MESSAGE_START_TASK_NAME = 'on-push-message'; |
var LOCATION_WATCH_NAME = 'location-watch'; |
/** |
+ * Chrome push messaging subchannel for messages causing an immediate poll. |
+ */ |
+var SUBCHANNEL_ID_POLL_NOW = 0; |
+ |
+/** |
+/** |
* Notification as it's sent by the server. |
* |
* @typedef {{ |
@@ -160,6 +167,7 @@ wrapper.instrumentChromeApiFunction( |
'preferencesPrivate.googleGeolocationAccessEnabled.onChange.addListener', |
0); |
wrapper.instrumentChromeApiFunction('permissions.contains', 1); |
+wrapper.instrumentChromeApiFunction('pushMessaging.onMessage.addListener', 0); |
wrapper.instrumentChromeApiFunction('runtime.onInstalled.addListener', 0); |
wrapper.instrumentChromeApiFunction('runtime.onStartup.addListener', 0); |
wrapper.instrumentChromeApiFunction('tabs.create', 1); |
@@ -515,25 +523,56 @@ function parseAndShowNotificationCards(response) { |
} |
/** |
- * Requests notification cards from the server. |
- * @param {Location} position Location of this computer. |
+ * Requests notification cards from the server for specified groups. |
+ * @param {Array.<string>} groupNames Names of groups that need to be refreshed. |
*/ |
-function requestNotificationCards(position) { |
- console.log('requestNotificationCards ' + JSON.stringify(position) + |
- ' from ' + NOTIFICATION_CARDS_URL); |
+function requestNotificationGroups(groupNames) { |
+ console.log('requestNotificationGroups from ' + NOTIFICATION_CARDS_URL + |
+ ', groupNames=' + JSON.stringify(groupNames)); |
if (!NOTIFICATION_CARDS_URL) |
return; |
recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
+ var requestParameters = '?timeZoneOffsetMs=' + |
+ (-new Date().getTimezoneOffset() * MS_IN_MINUTE); |
+ |
+ groupNames.forEach(function(groupName) { |
+ requestParameters += ('&requestTypes=' + groupName); |
+ }); |
+ |
+ console.log('requestNotificationGroups: request=' + requestParameters); |
+ |
+ var request = buildServerRequest('GET', 'notifications' + requestParameters); |
+ |
+ request.onloadend = function(event) { |
+ console.log('requestNotificationGroups-onloadend ' + request.status); |
+ if (request.status == HTTP_OK) { |
+ recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
+ parseAndShowNotificationCards(request.response); |
+ } |
+ }; |
+ |
+ setAuthorization(request, function(success) { |
+ if (success) |
+ request.send(); |
+ }); |
+} |
+ |
+/** |
+ * Requests notification cards from the server. |
+ * @param {Location} position Location of this computer. |
+ */ |
+function requestNotificationCards(position) { |
+ console.log('requestNotificationCards ' + JSON.stringify(position)); |
+ |
instrumented.storage.local.get('notificationGroups', function(items) { |
console.log('requestNotificationCards-storage-get ' + |
JSON.stringify(items)); |
items = items || {}; |
- var requestParameters = '?timeZoneOffsetMs=' + |
- (-new Date().getTimezoneOffset() * MS_IN_MINUTE); |
+ var groupsToRequest = []; |
if (items.notificationGroups) { |
var now = Date.now(); |
@@ -541,27 +580,11 @@ function requestNotificationCards(position) { |
for (var groupName in items.notificationGroups) { |
var group = items.notificationGroups[groupName]; |
if (group.nextPollTime <= now) |
- requestParameters += ('&requestTypes=' + groupName); |
+ groupsToRequest.push(groupName); |
} |
} |
- console.log('requestNotificationCards: request=' + requestParameters); |
- |
- var request = buildServerRequest('GET', |
- 'notifications' + requestParameters); |
- |
- request.onloadend = function(event) { |
- console.log('requestNotificationCards-onloadend ' + request.status); |
- if (request.status == HTTP_OK) { |
- recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
- parseAndShowNotificationCards(request.response); |
- } |
- }; |
- |
- setAuthorization(request, function(success) { |
- if (success) |
- request.send(); |
- }); |
+ requestNotificationGroups(groupsToRequest); |
}); |
} |
@@ -1034,3 +1057,25 @@ instrumented.omnibox.onInputEntered.addListener(function(text) { |
localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; |
initialize(); |
}); |
+ |
+instrumented.pushMessaging.onMessage.addListener(function(message) { |
+ // message.payload will be '' when the extension first starts. |
+ // Each time after signing in, we'll get latest payload for all channels. |
+ // So, we need to poll the server only when the payload is non-empty and has |
+ // changed. |
+ console.log('pushMessaging.onMessage ' + JSON.stringify(message)); |
+ if (message.subchannelId == SUBCHANNEL_ID_POLL_NOW && message.payload) { |
+ tasks.add(ON_PUSH_MESSAGE_START_TASK_NAME, function() { |
+ instrumented.storage.local.get('lastPollNowPayload', function(items) { |
+ if (items && items.lastPollNowPayload != message.payload) { |
+ chrome.storage.local.set({lastPollNowPayload: message.payload}); |
+ |
+ updateCardsAttempts.isRunning(function(running) { |
+ if (running) |
+ requestNotificationGroups([]); |
+ }); |
+ } |
+ }); |
+ }); |
+ } |
+}); |