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

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

Issue 183883027: Refactor Chrome Now Card Dismissal Stack 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 | no next file » | 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 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 console.log('requestCards @' + new Date()); 643 console.log('requestCards @' + new Date());
644 // LOCATION_REQUEST is a legacy histogram value when we requested location. 644 // LOCATION_REQUEST is a legacy histogram value when we requested location.
645 // This corresponds to the extension attempting to request for cards. 645 // This corresponds to the extension attempting to request for cards.
646 // We're keeping the name the same to keep our histograms in order. 646 // We're keeping the name the same to keep our histograms in order.
647 recordEvent(GoogleNowEvent.LOCATION_REQUEST); 647 recordEvent(GoogleNowEvent.LOCATION_REQUEST);
648 tasks.add(UPDATE_CARDS_TASK_NAME, function() { 648 tasks.add(UPDATE_CARDS_TASK_NAME, function() {
649 console.log('requestCards-task-begin'); 649 console.log('requestCards-task-begin');
650 updateCardsAttempts.isRunning(function(running) { 650 updateCardsAttempts.isRunning(function(running) {
651 if (running) { 651 if (running) {
652 updateCardsAttempts.planForNext(function() { 652 updateCardsAttempts.planForNext(function() {
653 processPendingDismissals(function(success) { 653 processPendingDismissals().then(function() {
skare_ 2014/03/07 01:57:51 does .then(requestNotificationCards) work?
robliao 2014/03/07 18:14:47 Yup! That should work. On 2014/03/07 01:57:51, Tra
654 if (success) { 654 // The cards are requested only if there are no unsent dismissals.
655 // The cards are requested only if there are no unsent dismissals. 655 requestNotificationCards();
656 requestNotificationCards();
657 }
658 }); 656 });
659 }); 657 });
660 } 658 }
661 }); 659 });
662 }); 660 });
663 } 661 }
664 662
665 /** 663 /**
666 * Sends a server request to dismiss a card. 664 * Sends a server request to dismiss a card.
667 * @param {ChromeNotificationId} chromeNotificationId chrome.notifications ID of 665 * @param {ChromeNotificationId} chromeNotificationId chrome.notifications ID of
668 * the card. 666 * the card.
669 * @param {number} dismissalTimeMs Time of the user's dismissal of the card in 667 * @param {number} dismissalTimeMs Time of the user's dismissal of the card in
670 * milliseconds since epoch. 668 * milliseconds since epoch.
671 * @param {DismissalData} dismissalData Data to build a dismissal request. 669 * @param {DismissalData} dismissalData Data to build a dismissal request.
672 * @param {function(boolean)} callbackBoolean Completion callback with 'done' 670 * @return {Promise} A promise to request the card dimissal, rejects on error.
rgustafson 2014/03/10 17:43:33 dismissal
robliao 2014/03/10 19:46:14 Done.
673 * parameter.
674 */ 671 */
675 function requestCardDismissal( 672 function requestCardDismissal(
676 chromeNotificationId, dismissalTimeMs, dismissalData, callbackBoolean) { 673 chromeNotificationId, dismissalTimeMs, dismissalData) {
677 console.log('requestDismissingCard ' + chromeNotificationId + 674 console.log('requestDismissingCard ' + chromeNotificationId +
678 ' from ' + NOTIFICATION_CARDS_URL + 675 ' from ' + NOTIFICATION_CARDS_URL +
679 ', dismissalData=' + JSON.stringify(dismissalData)); 676 ', dismissalData=' + JSON.stringify(dismissalData));
680 677
681 var dismissalAge = Date.now() - dismissalTimeMs; 678 var dismissalAge = Date.now() - dismissalTimeMs;
682 679
683 if (dismissalAge > MAXIMUM_DISMISSAL_AGE_MS) { 680 if (dismissalAge > MAXIMUM_DISMISSAL_AGE_MS) {
684 callbackBoolean(true); 681 callbackBoolean(true);
685 return; 682 return;
686 } 683 }
687 684
688 recordEvent(GoogleNowEvent.DISMISS_REQUEST_TOTAL); 685 recordEvent(GoogleNowEvent.DISMISS_REQUEST_TOTAL);
689 686
690 var requestParameters = 'notifications/' + dismissalData.notificationId + 687 var requestParameters = 'notifications/' + dismissalData.notificationId +
691 '?age=' + dismissalAge + 688 '?age=' + dismissalAge +
692 '&chromeNotificationId=' + chromeNotificationId; 689 '&chromeNotificationId=' + chromeNotificationId;
693 690
694 for (var paramField in dismissalData.parameters) 691 for (var paramField in dismissalData.parameters)
695 requestParameters += ('&' + paramField + 692 requestParameters += ('&' + paramField +
696 '=' + dismissalData.parameters[paramField]); 693 '=' + dismissalData.parameters[paramField]);
697 694
698 console.log('requestCardDismissal: requestParameters=' + requestParameters); 695 console.log('requestCardDismissal: requestParameters=' + requestParameters);
699 696
700 requestFromServer('DELETE', requestParameters).then(function(request) { 697 return requestFromServer('DELETE', requestParameters).then(function(request) {
701 console.log('requestDismissingCard-onloadend ' + request.status); 698 console.log('requestDismissingCard-onloadend ' + request.status);
702 if (request.status == HTTP_NOCONTENT) 699 if (request.status == HTTP_NOCONTENT)
703 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS); 700 recordEvent(GoogleNowEvent.DISMISS_REQUEST_SUCCESS);
704 701
705 // A dismissal doesn't require further retries if it was successful or 702 // A dismissal doesn't require further retries if it was successful or
706 // doesn't have a chance for successful completion. 703 // doesn't have a chance for successful completion.
707 var done = request.status == HTTP_NOCONTENT || 704 var done = request.status == HTTP_NOCONTENT ||
708 request.status == HTTP_BAD_REQUEST || 705 request.status == HTTP_BAD_REQUEST ||
709 request.status == HTTP_METHOD_NOT_ALLOWED; 706 request.status == HTTP_METHOD_NOT_ALLOWED;
710 callbackBoolean(done); 707 return done ? Promise.resolve() : Promise.reject();
711 }).catch(function() {
712 callbackBoolean(false);
713 }); 708 });
714 } 709 }
715 710
716 /** 711 /**
717 * Tries to send dismiss requests for all pending dismissals. 712 * Tries to send dismiss requests for all pending dismissals.
718 * @param {function(boolean)} callbackBoolean Completion callback with 'success' 713 * @return {Promise} A promise to process the pending dismissals.
719 * parameter. Success means that no pending dismissals are left. 714 * The promise is rejected if a problem was encountered.
720 */ 715 */
721 function processPendingDismissals(callbackBoolean) { 716 function processPendingDismissals() {
722 fillFromChromeLocalStorage({ 717 return fillFromChromeLocalStorage({
skare_ 2014/03/07 01:57:51 general comment on this pattern: this does make se
robliao 2014/03/07 18:14:47 Would we do the same if we were returning a very l
723 /** @type {Array.<PendingDismissal>} */ 718 /** @type {Array.<PendingDismissal>} */
724 pendingDismissals: [], 719 pendingDismissals: [],
725 /** @type {Object.<NotificationId, number>} */ 720 /** @type {Object.<NotificationId, number>} */
726 recentDismissals: {} 721 recentDismissals: {}
727 }).then(function(items) { 722 }).then(function(items) {
728 console.log( 723 console.log(
729 'processPendingDismissals-storage-get ' + JSON.stringify(items)); 724 'processPendingDismissals-storage-get ' + JSON.stringify(items));
730 725
731 var dismissalsChanged = false; 726 var dismissalsChanged = false;
732 727
733 function onFinish(success) { 728 function onFinish(success) {
734 if (dismissalsChanged) { 729 if (dismissalsChanged) {
735 chrome.storage.local.set({ 730 chrome.storage.local.set({
736 pendingDismissals: items.pendingDismissals, 731 pendingDismissals: items.pendingDismissals,
737 recentDismissals: items.recentDismissals 732 recentDismissals: items.recentDismissals
738 }); 733 });
739 } 734 }
740 callbackBoolean(success); 735 return success ? Promise.resolve() : Promise.reject();
741 } 736 }
742 737
743 function doProcessDismissals() { 738 function doProcessDismissals() {
744 if (items.pendingDismissals.length == 0) { 739 if (items.pendingDismissals.length == 0) {
745 dismissalAttempts.stop(); 740 dismissalAttempts.stop();
746 onFinish(true); 741 return onFinish(true);
747 return;
748 } 742 }
749 743
750 // Send dismissal for the first card, and if successful, repeat 744 // Send dismissal for the first card, and if successful, repeat
751 // recursively with the rest. 745 // recursively with the rest.
752 /** @type {PendingDismissal} */ 746 /** @type {PendingDismissal} */
753 var dismissal = items.pendingDismissals[0]; 747 var dismissal = items.pendingDismissals[0];
754 requestCardDismissal( 748 return requestCardDismissal(
755 dismissal.chromeNotificationId, 749 dismissal.chromeNotificationId,
756 dismissal.time, 750 dismissal.time,
757 dismissal.dismissalData, 751 dismissal.dismissalData).then(function() {
758 function(done) { 752 dismissalsChanged = true;
759 if (done) { 753 items.pendingDismissals.splice(0, 1);
760 dismissalsChanged = true; 754 items.recentDismissals[
761 items.pendingDismissals.splice(0, 1); 755 dismissal.dismissalData.notificationId] =
rgustafson 2014/03/10 17:43:33 move this onto previous line
robliao 2014/03/10 19:46:14 Done.
762 items.recentDismissals[ 756 Date.now();
763 dismissal.dismissalData.notificationId] = 757 return doProcessDismissals();
764 Date.now(); 758 }).catch(function() {
765 doProcessDismissals(); 759 return onFinish(false);
766 } else {
767 onFinish(false);
768 }
769 }); 760 });
770 } 761 }
771 762
772 doProcessDismissals(); 763 return doProcessDismissals();
773 }); 764 });
774 } 765 }
775 766
776 /** 767 /**
777 * Submits a task to send pending dismissals. 768 * Submits a task to send pending dismissals.
778 */ 769 */
779 function retryPendingDismissals() { 770 function retryPendingDismissals() {
780 tasks.add(RETRY_DISMISS_TASK_NAME, function() { 771 tasks.add(RETRY_DISMISS_TASK_NAME, function() {
781 dismissalAttempts.planForNext(function() { 772 dismissalAttempts.planForNext(function() {
782 processPendingDismissals(function(success) {}); 773 processPendingDismissals();
783 }); 774 });
784 }); 775 });
785 } 776 }
786 777
787 /** 778 /**
788 * Opens a URL in a new tab. 779 * Opens a URL in a new tab.
789 * @param {string} url URL to open. 780 * @param {string} url URL to open.
790 */ 781 */
791 function openUrl(url) { 782 function openUrl(url) {
792 instrumented.tabs.create({url: url}, function(tab) { 783 instrumented.tabs.create({url: url}, function(tab) {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 dismissalData: dismissalResult.dismissals[i] 860 dismissalData: dismissalResult.dismissals[i]
870 }; 861 };
871 items.pendingDismissals.push(dismissal); 862 items.pendingDismissals.push(dismissal);
872 } 863 }
873 864
874 items.notificationsData[chromeNotificationId] = 865 items.notificationsData[chromeNotificationId] =
875 dismissalResult.notificationData; 866 dismissalResult.notificationData;
876 867
877 chrome.storage.local.set(items); 868 chrome.storage.local.set(items);
878 869
879 processPendingDismissals(function(success) {}); 870 processPendingDismissals();
880 }); 871 });
881 }); 872 });
882 } 873 }
883 874
884 /** 875 /**
885 * Initializes the polling system to start fetching cards. 876 * Initializes the polling system to start fetching cards.
886 */ 877 */
887 function startPollingCards() { 878 function startPollingCards() {
888 console.log('startPollingCards'); 879 console.log('startPollingCards');
889 // Create an update timer for a case when for some reason requesting 880 // Create an update timer for a case when for some reason requesting
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 lastPollNowPayloads: items.lastPollNowPayloads, 1135 lastPollNowPayloads: items.lastPollNowPayloads,
1145 notificationGroups: items.notificationGroups 1136 notificationGroups: items.notificationGroups
1146 }); 1137 });
1147 1138
1148 requestCards(); 1139 requestCards();
1149 } 1140 }
1150 }); 1141 });
1151 }); 1142 });
1152 } 1143 }
1153 }); 1144 });
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698