Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 type: 'histogram-linear', | 241 type: 'histogram-linear', |
| 242 min: 1, | 242 min: 1, |
| 243 max: GoogleNowEvent.EVENTS_TOTAL, | 243 max: GoogleNowEvent.EVENTS_TOTAL, |
| 244 buckets: GoogleNowEvent.EVENTS_TOTAL + 1 | 244 buckets: GoogleNowEvent.EVENTS_TOTAL + 1 |
| 245 }; | 245 }; |
| 246 | 246 |
| 247 chrome.metricsPrivate.recordValue(metricDescription, event); | 247 chrome.metricsPrivate.recordValue(metricDescription, event); |
| 248 } | 248 } |
| 249 | 249 |
| 250 /** | 250 /** |
| 251 * Adds authorization behavior to the request. | 251 * Checks the result of the HTTP Request and updates the authentication |
| 252 * @param {XMLHttpRequest} request Server request. | 252 * manager on any failure. |
| 253 * @param {function(boolean)} callbackBoolean Completion callback with 'success' | 253 * @param {XMLHttpRequest} request XMLHTTPRequest that sent the authenticated |
|
rgustafson
2014/03/12 21:26:28
Nitpicky: match capitalization on the second usage
robliao
2014/03/12 22:21:32
Done.
| |
| 254 * parameter. | 254 * request. |
| 255 */ | 255 */ |
| 256 function setAuthorization(request, callbackBoolean) { | 256 function checkAuthenticationStatus(request) { |
| 257 authenticationManager.getAuthToken().then(function(token) { | 257 if (request.status == HTTP_FORBIDDEN || |
| 258 request.status == HTTP_UNAUTHORIZED) { | |
| 259 authenticationManager.removeToken(token); | |
| 260 } | |
| 261 } | |
| 262 | |
| 263 /** | |
| 264 * Builds and sends an authenticated request to the notification server. | |
| 265 * @param {string} method Request method. | |
| 266 * @param {string} handlerName Server handler to send the request to. | |
| 267 * @param {string=} opt_contentType Value for the Content-type header. | |
| 268 * @return {Promise} A promise to issue a request to the server. | |
| 269 * The promise rejects if there is a client-side authentication issue. | |
| 270 */ | |
| 271 function requestFromServer(method, handlerName, opt_contentType) { | |
| 272 return authenticationManager.getAuthToken().then(function(token) { | |
| 273 var request = buildServerRequest(method, handlerName, opt_contentType); | |
| 258 request.setRequestHeader('Authorization', 'Bearer ' + token); | 274 request.setRequestHeader('Authorization', 'Bearer ' + token); |
| 259 | 275 var requestPromise = new Promise(function(resolve) { |
| 260 // Instrument onloadend to remove stale auth tokens. | 276 request.addEventListener('loadend', function() { |
| 261 var originalOnLoadEnd = request.onloadend; | 277 resolve(request); |
| 262 request.onloadend = wrapper.wrapCallback(function(event) { | 278 }, false); |
| 263 if (request.status == HTTP_FORBIDDEN || | 279 request.send(); |
| 264 request.status == HTTP_UNAUTHORIZED) { | |
| 265 authenticationManager.removeToken(token).then(function() { | |
| 266 originalOnLoadEnd(event); | |
| 267 }); | |
| 268 } else { | |
| 269 originalOnLoadEnd(event); | |
| 270 } | |
| 271 }); | 280 }); |
| 272 | 281 requestPromise.then(checkAuthenticationStatus); |
| 273 callbackBoolean(true); | 282 return requestPromise; |
| 274 }).catch(function() { | |
| 275 callbackBoolean(false); | |
| 276 }); | 283 }); |
| 277 } | 284 } |
| 278 | 285 |
| 279 /** | 286 /** |
| 280 * Shows parsed and combined cards as notifications. | 287 * Shows parsed and combined cards as notifications. |
| 281 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from | 288 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from |
| 282 * group name to group information. | 289 * group name to group information. |
| 283 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from | 290 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from |
| 284 * chromeNotificationId to the combined card, containing cards to show. | 291 * chromeNotificationId to the combined card, containing cards to show. |
| 285 * @param {function()} onSuccess Called on success. | 292 * @param {function()} onSuccess Called on success. |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 560 } | 567 } |
| 561 | 568 |
| 562 groupNames.forEach(function(groupName) { | 569 groupNames.forEach(function(groupName) { |
| 563 requestParameters += ('&requestTypes=' + groupName); | 570 requestParameters += ('&requestTypes=' + groupName); |
| 564 }); | 571 }); |
| 565 | 572 |
| 566 requestParameters += '&uiLocale=' + navigator.language; | 573 requestParameters += '&uiLocale=' + navigator.language; |
| 567 | 574 |
| 568 console.log('requestNotificationGroups: request=' + requestParameters); | 575 console.log('requestNotificationGroups: request=' + requestParameters); |
| 569 | 576 |
| 570 var request = buildServerRequest('GET', 'notifications' + requestParameters); | 577 requestFromServer('GET', 'notifications' + requestParameters).then( |
| 571 | 578 function(request) { |
| 572 request.onloadend = function(event) { | 579 console.log('requestNotificationGroups-received ' + request.status); |
| 573 console.log('requestNotificationGroups-onloadend ' + request.status); | 580 if (request.status == HTTP_OK) { |
| 574 if (request.status == HTTP_OK) { | 581 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
| 575 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); | 582 processServerResponse( |
| 576 processServerResponse( | 583 JSON.parse(request.responseText), cardShownCallback); |
| 577 JSON.parse(request.responseText), cardShownCallback); | 584 } |
| 578 } | 585 }); |
| 579 }; | |
| 580 | |
| 581 setAuthorization(request, function(success) { | |
| 582 if (success) | |
| 583 request.send(); | |
| 584 }); | |
| 585 } | 586 } |
| 586 | 587 |
| 587 /** | 588 /** |
| 588 * Requests the account opted-in state from the server. | 589 * Requests the account opted-in state from the server. |
| 589 * @param {function()} optedInCallback Function that will be called if | 590 * @param {function()} optedInCallback Function that will be called if |
| 590 * opted-in state is 'true'. | 591 * opted-in state is 'true'. |
| 591 */ | 592 */ |
| 592 function requestOptedIn(optedInCallback) { | 593 function requestOptedIn(optedInCallback) { |
| 593 console.log('requestOptedIn from ' + NOTIFICATION_CARDS_URL); | 594 console.log('requestOptedIn from ' + NOTIFICATION_CARDS_URL); |
| 594 | 595 |
| 595 var request = buildServerRequest('GET', 'settings/optin'); | 596 requestFromServer('GET', 'settings/optin').then(function(request) { |
| 596 | |
| 597 request.onloadend = function(event) { | |
| 598 console.log( | 597 console.log( |
| 599 'requestOptedIn-onloadend ' + request.status + ' ' + request.response); | 598 'requestOptedIn-received ' + request.status + ' ' + request.response); |
| 600 if (request.status == HTTP_OK) { | 599 if (request.status == HTTP_OK) { |
| 601 var parsedResponse = JSON.parse(request.responseText); | 600 var parsedResponse = JSON.parse(request.responseText); |
| 602 if (parsedResponse.value) { | 601 if (parsedResponse.value) { |
| 603 chrome.storage.local.set({googleNowEnabled: true}); | 602 chrome.storage.local.set({googleNowEnabled: true}); |
| 604 optedInCallback(); | 603 optedInCallback(); |
| 605 // Google Now was disabled, now it's enabled. This is a state change. | 604 // Google Now was disabled, now it's enabled. This is a state change. |
| 606 onStateChange(); | 605 onStateChange(); |
| 607 } else { | 606 } else { |
| 608 scheduleNextPoll({}, false); | 607 scheduleNextPoll({}, false); |
| 609 } | 608 } |
| 610 } | 609 } |
| 611 }; | |
| 612 | |
| 613 setAuthorization(request, function(success) { | |
| 614 if (success) | |
| 615 request.send(); | |
| 616 }); | 610 }); |
| 617 } | 611 } |
| 618 | 612 |
| 619 /** | 613 /** |
| 620 * Requests notification cards from the server. | 614 * Requests notification cards from the server. |
| 621 */ | 615 */ |
| 622 function requestNotificationCards() { | 616 function requestNotificationCards() { |
| 623 console.log('requestNotificationCards'); | 617 console.log('requestNotificationCards'); |
| 624 | 618 |
| 625 fillFromChromeLocalStorage({ | 619 fillFromChromeLocalStorage({ |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 var requestParameters = 'notifications/' + dismissalData.notificationId + | 698 var requestParameters = 'notifications/' + dismissalData.notificationId + |
| 705 '?age=' + dismissalAge + | 699 '?age=' + dismissalAge + |
| 706 '&chromeNotificationId=' + chromeNotificationId; | 700 '&chromeNotificationId=' + chromeNotificationId; |
| 707 | 701 |
| 708 for (var paramField in dismissalData.parameters) | 702 for (var paramField in dismissalData.parameters) |
| 709 requestParameters += ('&' + paramField + | 703 requestParameters += ('&' + paramField + |
| 710 '=' + dismissalData.parameters[paramField]); | 704 '=' + dismissalData.parameters[paramField]); |
| 711 | 705 |
| 712 console.log('requestCardDismissal: requestParameters=' + requestParameters); | 706 console.log('requestCardDismissal: requestParameters=' + requestParameters); |
| 713 | 707 |
| 714 var request = buildServerRequest('DELETE', requestParameters); | 708 requestFromServer('DELETE', requestParameters).then(function(request) { |
| 715 request.onloadend = function(event) { | |
| 716 console.log('requestDismissingCard-onloadend ' + request.status); | 709 console.log('requestDismissingCard-onloadend ' + request.status); |
| 717 if (request.status == HTTP_NOCONTENT) | 710 if (request.status == HTTP_NOCONTENT) |
| 718 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS); | 711 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS); |
| 719 | 712 |
| 720 // A dismissal doesn't require further retries if it was successful or | 713 // A dismissal doesn't require further retries if it was successful or |
| 721 // doesn't have a chance for successful completion. | 714 // doesn't have a chance for successful completion. |
| 722 var done = request.status == HTTP_NOCONTENT || | 715 var done = request.status == HTTP_NOCONTENT || |
| 723 request.status == HTTP_BAD_REQUEST || | 716 request.status == HTTP_BAD_REQUEST || |
| 724 request.status == HTTP_METHOD_NOT_ALLOWED; | 717 request.status == HTTP_METHOD_NOT_ALLOWED; |
| 725 callbackBoolean(done); | 718 callbackBoolean(done); |
| 726 }; | 719 }).catch(function() { |
| 727 | 720 callbackBoolean(false); |
| 728 setAuthorization(request, function(success) { | |
| 729 if (success) | |
| 730 request.send(); | |
| 731 else | |
| 732 callbackBoolean(false); | |
| 733 }); | 721 }); |
| 734 } | 722 } |
| 735 | 723 |
| 736 /** | 724 /** |
| 737 * Tries to send dismiss requests for all pending dismissals. | 725 * Tries to send dismiss requests for all pending dismissals. |
| 738 * @param {function(boolean)} callbackBoolean Completion callback with 'success' | 726 * @param {function(boolean)} callbackBoolean Completion callback with 'success' |
| 739 * parameter. Success means that no pending dismissals are left. | 727 * parameter. Success means that no pending dismissals are left. |
| 740 */ | 728 */ |
| 741 function processPendingDismissals(callbackBoolean) { | 729 function processPendingDismissals(callbackBoolean) { |
| 742 fillFromChromeLocalStorage({ | 730 fillFromChromeLocalStorage({ |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1164 lastPollNowPayloads: items.lastPollNowPayloads, | 1152 lastPollNowPayloads: items.lastPollNowPayloads, |
| 1165 notificationGroups: items.notificationGroups | 1153 notificationGroups: items.notificationGroups |
| 1166 }); | 1154 }); |
| 1167 | 1155 |
| 1168 requestCards(); | 1156 requestCards(); |
| 1169 } | 1157 } |
| 1170 }); | 1158 }); |
| 1171 }); | 1159 }); |
| 1172 } | 1160 } |
| 1173 }); | 1161 }); |
| OLD | NEW |