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

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

Issue 187263002: Refactor Authenticated Server Requests to use Promises (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/utility.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 * Builds and sends an authenticated request to the notification server.
252 * @param {XMLHttpRequest} request Server request. 252 * @param {string} method Request method.
253 * @param {function(boolean)} callbackBoolean Completion callback with 'success' 253 * @param {string} handlerName Server handler to send the request to.
rgustafson 2014/03/07 00:53:06 This is more than the handler. It includes params
robliao 2014/03/07 01:39:40 Unfortunately there is no real name for the path+q
254 * parameter. 254 * @param {string=} opt_contentType Value for the Content-type header.
255 * @return {Promise} A promise to issue a request to the server.
256 * The promise rejects if there is a client-side authentication issue.
255 */ 257 */
256 function setAuthorization(request, callbackBoolean) { 258 function requestFromServer(method, handlerName, opt_contentType) {
257 authenticationManager.getAuthToken().then(function(token) { 259 return authenticationManager.getAuthToken().then(function(token) {
260 var request = buildServerRequest(method, handlerName, opt_contentType);
258 request.setRequestHeader('Authorization', 'Bearer ' + token); 261 request.setRequestHeader('Authorization', 'Bearer ' + token);
259 262 var requestPromise = new Promise(function(resolve) {
260 // Instrument onloadend to remove stale auth tokens. 263 request.addEventListener('loadend', function() {
rgustafson 2014/03/07 00:53:06 any difference between this and doing request.onlo
robliao 2014/03/07 01:39:40 It doesn't overwrite any existing onloadend that w
261 var originalOnLoadEnd = request.onloadend; 264 resolve(request);
262 request.onloadend = wrapper.wrapCallback(function(event) { 265 }, false);
rgustafson 2014/03/07 00:53:06 This parameter is optional and looks like it defau
robliao 2014/03/07 01:39:40 Given that the default is not consistent (false in
rgustafson 2014/03/11 21:29:30 It's false for Firefox: https://developer.mozilla.
robliao 2014/03/12 00:13:11 Instead we'll wonder what the default is :-) for t
266 request.send();
267 });
268 requestPromise.then(function() {
263 if (request.status == HTTP_FORBIDDEN || 269 if (request.status == HTTP_FORBIDDEN ||
264 request.status == HTTP_UNAUTHORIZED) { 270 request.status == HTTP_UNAUTHORIZED) {
265 authenticationManager.removeToken(token).then(function() { 271 authenticationManager.removeToken(token);
266 originalOnLoadEnd(event);
267 });
268 } else {
269 originalOnLoadEnd(event);
270 } 272 }
271 }); 273 });
272 274 return requestPromise;
273 callbackBoolean(true);
274 }).catch(function() {
275 callbackBoolean(false);
276 }); 275 });
277 } 276 }
278 277
279 /** 278 /**
280 * Shows parsed and combined cards as notifications. 279 * Shows parsed and combined cards as notifications.
281 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from 280 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from
282 * group name to group information. 281 * group name to group information.
283 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from 282 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from
284 * chromeNotificationId to the combined card, containing cards to show. 283 * chromeNotificationId to the combined card, containing cards to show.
285 * @param {function()} onSuccess Called on success. 284 * @param {function()} onSuccess Called on success.
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 } 559 }
561 560
562 groupNames.forEach(function(groupName) { 561 groupNames.forEach(function(groupName) {
563 requestParameters += ('&requestTypes=' + groupName); 562 requestParameters += ('&requestTypes=' + groupName);
564 }); 563 });
565 564
566 requestParameters += '&uiLocale=' + navigator.language; 565 requestParameters += '&uiLocale=' + navigator.language;
567 566
568 console.log('requestNotificationGroups: request=' + requestParameters); 567 console.log('requestNotificationGroups: request=' + requestParameters);
569 568
570 var request = buildServerRequest('GET', 'notifications' + requestParameters); 569 requestFromServer('GET', 'notifications' + requestParameters).then(
571 570 function(request) {
572 request.onloadend = function(event) { 571 console.log('requestNotificationGroups-received ' + request.status);
573 console.log('requestNotificationGroups-onloadend ' + request.status); 572 if (request.status == HTTP_OK) {
574 if (request.status == HTTP_OK) { 573 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS);
575 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); 574 processServerResponse(
576 processServerResponse( 575 JSON.parse(request.responseText), cardShownCallback);
577 JSON.parse(request.responseText), cardShownCallback); 576 }
578 } 577 });
579 };
580
581 setAuthorization(request, function(success) {
582 if (success)
583 request.send();
584 });
585 } 578 }
586 579
587 /** 580 /**
588 * Requests the account opted-in state from the server. 581 * Requests the account opted-in state from the server.
589 * @param {function()} optedInCallback Function that will be called if 582 * @param {function()} optedInCallback Function that will be called if
590 * opted-in state is 'true'. 583 * opted-in state is 'true'.
591 */ 584 */
592 function requestOptedIn(optedInCallback) { 585 function requestOptedIn(optedInCallback) {
593 console.log('requestOptedIn from ' + NOTIFICATION_CARDS_URL); 586 console.log('requestOptedIn from ' + NOTIFICATION_CARDS_URL);
594 587
595 var request = buildServerRequest('GET', 'settings/optin'); 588 requestFromServer('GET', 'settings/optin').then(function(request) {
596
597 request.onloadend = function(event) {
598 console.log( 589 console.log(
599 'requestOptedIn-onloadend ' + request.status + ' ' + request.response); 590 'requestOptedIn-received ' + request.status + ' ' + request.response);
600 if (request.status == HTTP_OK) { 591 if (request.status == HTTP_OK) {
601 var parsedResponse = JSON.parse(request.responseText); 592 var parsedResponse = JSON.parse(request.responseText);
602 if (parsedResponse.value) { 593 if (parsedResponse.value) {
603 chrome.storage.local.set({googleNowEnabled: true}); 594 chrome.storage.local.set({googleNowEnabled: true});
604 optedInCallback(); 595 optedInCallback();
605 // Google Now was disabled, now it's enabled. This is a state change. 596 // Google Now was disabled, now it's enabled. This is a state change.
606 onStateChange(); 597 onStateChange();
607 } else { 598 } else {
608 scheduleNextPoll({}, false); 599 scheduleNextPoll({}, false);
609 } 600 }
610 } 601 }
611 };
612
613 setAuthorization(request, function(success) {
614 if (success)
615 request.send();
616 }); 602 });
617 } 603 }
618 604
619 /** 605 /**
620 * Requests notification cards from the server. 606 * Requests notification cards from the server.
621 */ 607 */
622 function requestNotificationCards() { 608 function requestNotificationCards() {
623 console.log('requestNotificationCards'); 609 console.log('requestNotificationCards');
624 610
625 fillFromChromeLocalStorage({ 611 fillFromChromeLocalStorage({
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 var requestParameters = 'notifications/' + dismissalData.notificationId + 690 var requestParameters = 'notifications/' + dismissalData.notificationId +
705 '?age=' + dismissalAge + 691 '?age=' + dismissalAge +
706 '&chromeNotificationId=' + chromeNotificationId; 692 '&chromeNotificationId=' + chromeNotificationId;
707 693
708 for (var paramField in dismissalData.parameters) 694 for (var paramField in dismissalData.parameters)
709 requestParameters += ('&' + paramField + 695 requestParameters += ('&' + paramField +
710 '=' + dismissalData.parameters[paramField]); 696 '=' + dismissalData.parameters[paramField]);
711 697
712 console.log('requestCardDismissal: requestParameters=' + requestParameters); 698 console.log('requestCardDismissal: requestParameters=' + requestParameters);
713 699
714 var request = buildServerRequest('DELETE', requestParameters); 700 requestFromServer('DELETE', requestParameters).then(function(request) {
715 request.onloadend = function(event) {
716 console.log('requestDismissingCard-onloadend ' + request.status); 701 console.log('requestDismissingCard-onloadend ' + request.status);
717 if (request.status == HTTP_NOCONTENT) 702 if (request.status == HTTP_NOCONTENT)
718 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS); 703 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS);
719 704
720 // A dismissal doesn't require further retries if it was successful or 705 // A dismissal doesn't require further retries if it was successful or
721 // doesn't have a chance for successful completion. 706 // doesn't have a chance for successful completion.
722 var done = request.status == HTTP_NOCONTENT || 707 var done = request.status == HTTP_NOCONTENT ||
723 request.status == HTTP_BAD_REQUEST || 708 request.status == HTTP_BAD_REQUEST ||
724 request.status == HTTP_METHOD_NOT_ALLOWED; 709 request.status == HTTP_METHOD_NOT_ALLOWED;
725 callbackBoolean(done); 710 callbackBoolean(done);
726 }; 711 }).catch(function() {
727 712 callbackBoolean(false);
728 setAuthorization(request, function(success) {
729 if (success)
730 request.send();
731 else
732 callbackBoolean(false);
733 }); 713 });
734 } 714 }
735 715
736 /** 716 /**
737 * Tries to send dismiss requests for all pending dismissals. 717 * Tries to send dismiss requests for all pending dismissals.
738 * @param {function(boolean)} callbackBoolean Completion callback with 'success' 718 * @param {function(boolean)} callbackBoolean Completion callback with 'success'
739 * parameter. Success means that no pending dismissals are left. 719 * parameter. Success means that no pending dismissals are left.
740 */ 720 */
741 function processPendingDismissals(callbackBoolean) { 721 function processPendingDismissals(callbackBoolean) {
742 fillFromChromeLocalStorage({ 722 fillFromChromeLocalStorage({
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 lastPollNowPayloads: items.lastPollNowPayloads, 1144 lastPollNowPayloads: items.lastPollNowPayloads,
1165 notificationGroups: items.notificationGroups 1145 notificationGroups: items.notificationGroups
1166 }); 1146 });
1167 1147
1168 requestCards(); 1148 requestCards();
1169 } 1149 }
1170 }); 1150 });
1171 }); 1151 });
1172 } 1152 }
1173 }); 1153 });
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/utility.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698