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

Side by Side Diff: chrome/browser/resources/google_now/background.js

Issue 27223006: Requesting cards on push messages (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * @fileoverview The event page for Google Now for Chrome implementation. 8 * @fileoverview The event page for Google Now for Chrome implementation.
9 * The Google Now event page gets Google Now cards from the server and shows 9 * The Google Now event page gets Google Now cards from the server and shows
10 * them as Chrome notifications. 10 * them as Chrome notifications.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 var DISMISS_RETENTION_TIME_MS = 20 * 60 * 1000; // 20 minutes 74 var DISMISS_RETENTION_TIME_MS = 20 * 60 * 1000; // 20 minutes
75 75
76 /** 76 /**
77 * Names for tasks that can be created by the extension. 77 * Names for tasks that can be created by the extension.
78 */ 78 */
79 var UPDATE_CARDS_TASK_NAME = 'update-cards'; 79 var UPDATE_CARDS_TASK_NAME = 'update-cards';
80 var DISMISS_CARD_TASK_NAME = 'dismiss-card'; 80 var DISMISS_CARD_TASK_NAME = 'dismiss-card';
81 var RETRY_DISMISS_TASK_NAME = 'retry-dismiss'; 81 var RETRY_DISMISS_TASK_NAME = 'retry-dismiss';
82 var STATE_CHANGED_TASK_NAME = 'state-changed'; 82 var STATE_CHANGED_TASK_NAME = 'state-changed';
83 var SHOW_ON_START_TASK_NAME = 'show-cards-on-start'; 83 var SHOW_ON_START_TASK_NAME = 'show-cards-on-start';
84 var ON_PUSH_MESSAGE_START_TASK_NAME = 'on-push-message';
84 85
85 var LOCATION_WATCH_NAME = 'location-watch'; 86 var LOCATION_WATCH_NAME = 'location-watch';
86 87
87 var WELCOME_TOAST_NOTIFICATION_ID = 'enable-now-toast'; 88 var WELCOME_TOAST_NOTIFICATION_ID = 'enable-now-toast';
88 89
89 /** 90 /**
91 * Chrome push messaging subchannel for messages causing an immediate poll.
92 */
93 var SUBCHANNEL_ID_POLL_NOW = 0;
94
95 /**
90 * The indices of the buttons that are displayed on the welcome toast. 96 * The indices of the buttons that are displayed on the welcome toast.
91 * @enum {number} 97 * @enum {number}
92 */ 98 */
93 var ToastButtonIndex = {YES: 0, NO: 1}; 99 var ToastButtonIndex = {YES: 0, NO: 1};
94 100
95 /** 101 /**
96 * Notification as it's sent by the server. 102 * Notification as it's sent by the server.
97 * 103 *
98 * @typedef {{ 104 * @typedef {{
99 * notificationId: string, 105 * notificationId: string,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 wrapper.instrumentChromeApiFunction('notifications.onClicked.addListener', 0); 167 wrapper.instrumentChromeApiFunction('notifications.onClicked.addListener', 0);
162 wrapper.instrumentChromeApiFunction('notifications.onClosed.addListener', 0); 168 wrapper.instrumentChromeApiFunction('notifications.onClosed.addListener', 0);
163 wrapper.instrumentChromeApiFunction('omnibox.onInputEntered.addListener', 0); 169 wrapper.instrumentChromeApiFunction('omnibox.onInputEntered.addListener', 0);
164 wrapper.instrumentChromeApiFunction( 170 wrapper.instrumentChromeApiFunction(
165 'preferencesPrivate.googleGeolocationAccessEnabled.get', 171 'preferencesPrivate.googleGeolocationAccessEnabled.get',
166 1); 172 1);
167 wrapper.instrumentChromeApiFunction( 173 wrapper.instrumentChromeApiFunction(
168 'preferencesPrivate.googleGeolocationAccessEnabled.onChange.addListener', 174 'preferencesPrivate.googleGeolocationAccessEnabled.onChange.addListener',
169 0); 175 0);
170 wrapper.instrumentChromeApiFunction('permissions.contains', 1); 176 wrapper.instrumentChromeApiFunction('permissions.contains', 1);
177 wrapper.instrumentChromeApiFunction('pushMessaging.onMessage.addListener', 0);
171 wrapper.instrumentChromeApiFunction('runtime.onInstalled.addListener', 0); 178 wrapper.instrumentChromeApiFunction('runtime.onInstalled.addListener', 0);
172 wrapper.instrumentChromeApiFunction('runtime.onStartup.addListener', 0); 179 wrapper.instrumentChromeApiFunction('runtime.onStartup.addListener', 0);
173 wrapper.instrumentChromeApiFunction('tabs.create', 1); 180 wrapper.instrumentChromeApiFunction('tabs.create', 1);
174 wrapper.instrumentChromeApiFunction('storage.local.get', 1); 181 wrapper.instrumentChromeApiFunction('storage.local.get', 1);
175 182
176 var updateCardsAttempts = buildAttemptManager( 183 var updateCardsAttempts = buildAttemptManager(
177 'cards-update', 184 'cards-update',
178 requestLocation, 185 requestLocation,
179 INITIAL_POLLING_PERIOD_SECONDS, 186 INITIAL_POLLING_PERIOD_SECONDS,
180 MAXIMUM_POLLING_PERIOD_SECONDS); 187 MAXIMUM_POLLING_PERIOD_SECONDS);
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 } 527 }
521 528
522 scheduleNextPoll(items.notificationGroups); 529 scheduleNextPoll(items.notificationGroups);
523 chrome.storage.local.set({notificationGroups: items.notificationGroups}); 530 chrome.storage.local.set({notificationGroups: items.notificationGroups});
524 mergeAndShowNotificationCards(); 531 mergeAndShowNotificationCards();
525 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); 532 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS);
526 }); 533 });
527 } 534 }
528 535
529 /** 536 /**
537 * Requests notification cards from the server for specified groups.
538 * @param {Array.<string>} groupNames Names of groups that need to be regreshed.
539 */
540 function requestNotificationGroups(groupNames) {
541 console.log('requestNotificationGroups from ' + NOTIFICATION_CARDS_URL +
542 ', groupNames=' + JSON.stringify(groupNames));
543
544 if (!NOTIFICATION_CARDS_URL)
545 return;
546
547 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL);
548
549 var requestParameters = '?timeZoneOffsetMs=' +
550 (-new Date().getTimezoneOffset() * MS_IN_MINUTE);
551
552 groupNames.forEach(function(groupName) {
553 requestParameters += ('&requestTypes=' + groupName);
554 });
555
556 console.log('requestNotificationGroups: request=' + requestParameters);
557
558 var request = buildServerRequest('GET', 'notifications' + requestParameters);
559
560 request.onloadend = function(event) {
561 console.log('requestNotificationGroups-onloadend ' + request.status);
562 if (request.status == HTTP_OK) {
563 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS);
564 parseAndShowNotificationCards(request.response);
565 }
566 };
567
568 setAuthorization(request, function(success) {
569 if (success)
570 request.send();
571 });
572 }
573
574 /**
530 * Requests notification cards from the server. 575 * Requests notification cards from the server.
531 * @param {Location} position Location of this computer. 576 * @param {Location} position Location of this computer.
532 */ 577 */
533 function requestNotificationCards(position) { 578 function requestNotificationCards(position) {
534 console.log('requestNotificationCards ' + JSON.stringify(position) + 579 console.log('requestNotificationCards ' + JSON.stringify(position));
535 ' from ' + NOTIFICATION_CARDS_URL);
536
537 if (!NOTIFICATION_CARDS_URL)
538 return;
539
540 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL);
541 580
542 instrumented.storage.local.get('notificationGroups', function(items) { 581 instrumented.storage.local.get('notificationGroups', function(items) {
543 console.log('requestNotificationCards-storage-get ' + 582 console.log('requestNotificationCards-storage-get ' +
544 JSON.stringify(items)); 583 JSON.stringify(items));
545 items = items || {}; 584 items = items || {};
546 585
547 var requestParameters = '?timeZoneOffsetMs=' + 586 var requestParameters = '?timeZoneOffsetMs=' +
548 (-new Date().getTimezoneOffset() * MS_IN_MINUTE); 587 (-new Date().getTimezoneOffset() * MS_IN_MINUTE);
549 588
589 var groupsToRequest = [];
590
550 if (items.notificationGroups) { 591 if (items.notificationGroups) {
551 var now = Date.now(); 592 var now = Date.now();
552 593
553 for (var groupName in items.notificationGroups) { 594 for (var groupName in items.notificationGroups) {
554 var group = items.notificationGroups[groupName]; 595 var group = items.notificationGroups[groupName];
555 if (group.nextPollTime <= now) 596 if (group.nextPollTime <= now)
556 requestParameters += ('&requestTypes=' + groupName); 597 groupsToRequest.push(groupName);
557 } 598 }
558 } 599 }
559 600
560 console.log('requestNotificationCards: request=' + requestParameters); 601 requestNotificationGroups(groupsToRequest);
561
562 var request = buildServerRequest('GET',
563 'notifications' + requestParameters);
564
565 request.onloadend = function(event) {
566 console.log('requestNotificationCards-onloadend ' + request.status);
567 if (request.status == HTTP_OK) {
568 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS);
569 parseAndShowNotificationCards(request.response);
570 }
571 };
572
573 setAuthorization(request, function(success) {
574 if (success)
575 request.send();
576 });
577 }); 602 });
578 } 603 }
579 604
580 /** 605 /**
581 * Starts getting location for a cards update. 606 * Starts getting location for a cards update.
582 */ 607 */
583 function requestLocation() { 608 function requestLocation() {
584 console.log('requestLocation'); 609 console.log('requestLocation');
585 recordEvent(GoogleNowEvent.LOCATION_REQUEST); 610 recordEvent(GoogleNowEvent.LOCATION_REQUEST);
586 // TODO(vadimt): Figure out location request options. 611 // TODO(vadimt): Figure out location request options.
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 1165
1141 instrumented.location.onLocationUpdate.addListener(function(position) { 1166 instrumented.location.onLocationUpdate.addListener(function(position) {
1142 recordEvent(GoogleNowEvent.LOCATION_UPDATE); 1167 recordEvent(GoogleNowEvent.LOCATION_UPDATE);
1143 updateNotificationsCards(position); 1168 updateNotificationsCards(position);
1144 }); 1169 });
1145 1170
1146 instrumented.omnibox.onInputEntered.addListener(function(text) { 1171 instrumented.omnibox.onInputEntered.addListener(function(text) {
1147 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; 1172 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text;
1148 initialize(); 1173 initialize();
1149 }); 1174 });
1175
1176 instrumented.pushMessaging.onMessage.addListener(function(message) {
1177 if (message.subchannelId == SUBCHANNEL_ID_POLL_NOW && message.payload) {
1178 tasks.add(ON_PUSH_MESSAGE_START_TASK_NAME, function() {
1179 instrumented.storage.local.get('lastPollNowPayload', function(items) {
1180 if (items && items.lastPollNowPayload != message.payload) {
1181 chrome.storage.local.set({lastPollNowPayload: message.payload});
1182
1183 authenticationManager.isSignedIn(function(token) {
1184 if (token)
1185 requestNotificationGroups([]);
1186 });
1187 }
1188 });
1189 });
1190 }
1191 console.log(JSON.stringify(message));
robliao 2013/10/15 00:04:55 This should either be removed or annotated with wh
vadimt 2013/10/15 01:25:47 Done.
1192 });
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/manifest.json » ('j') | chrome/browser/resources/google_now/manifest.json » ('J')

Powered by Google App Engine
This is Rietveld 408576698