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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 | 113 |
| 114 return false; | 114 return false; |
| 115 } | 115 } |
| 116 | 116 |
| 117 var googleGeolocationAccessEnabledPref = | 117 var googleGeolocationAccessEnabledPref = |
| 118 chrome.preferencesPrivate.googleGeolocationAccessEnabled; | 118 chrome.preferencesPrivate.googleGeolocationAccessEnabled; |
| 119 | 119 |
| 120 var tasks = buildTaskManager(areTasksConflicting); | 120 var tasks = buildTaskManager(areTasksConflicting); |
| 121 | 121 |
| 122 // Add error processing to API calls. | 122 // Add error processing to API calls. |
| 123 tasks.instrumentApiFunction(chrome.identity, 'getAuthToken', 1); | |
| 124 tasks.instrumentApiFunction(chrome.identity, 'removeCachedAuthToken', 1); | |
| 125 tasks.instrumentApiFunction(chrome.location.onLocationUpdate, 'addListener', 0); | 123 tasks.instrumentApiFunction(chrome.location.onLocationUpdate, 'addListener', 0); |
| 126 tasks.instrumentApiFunction(chrome.notifications, 'create', 2); | 124 tasks.instrumentApiFunction(chrome.notifications, 'create', 2); |
| 127 tasks.instrumentApiFunction(chrome.notifications, 'update', 2); | 125 tasks.instrumentApiFunction(chrome.notifications, 'update', 2); |
| 128 tasks.instrumentApiFunction(chrome.notifications, 'getAll', 0); | 126 tasks.instrumentApiFunction(chrome.notifications, 'getAll', 0); |
| 129 tasks.instrumentApiFunction( | 127 tasks.instrumentApiFunction( |
| 130 chrome.notifications.onButtonClicked, 'addListener', 0); | 128 chrome.notifications.onButtonClicked, 'addListener', 0); |
| 131 tasks.instrumentApiFunction(chrome.notifications.onClicked, 'addListener', 0); | 129 tasks.instrumentApiFunction(chrome.notifications.onClicked, 'addListener', 0); |
| 132 tasks.instrumentApiFunction(chrome.notifications.onClosed, 'addListener', 0); | 130 tasks.instrumentApiFunction(chrome.notifications.onClosed, 'addListener', 0); |
| 133 tasks.instrumentApiFunction( | 131 tasks.instrumentApiFunction( |
| 134 googleGeolocationAccessEnabledPref.onChange, | 132 googleGeolocationAccessEnabledPref.onChange, |
| 135 'addListener', | 133 'addListener', |
| 136 0); | 134 0); |
| 137 tasks.instrumentApiFunction(chrome.runtime.onInstalled, 'addListener', 0); | 135 tasks.instrumentApiFunction(chrome.runtime.onInstalled, 'addListener', 0); |
| 138 tasks.instrumentApiFunction(chrome.runtime.onStartup, 'addListener', 0); | 136 tasks.instrumentApiFunction(chrome.runtime.onStartup, 'addListener', 0); |
| 139 tasks.instrumentApiFunction(chrome.tabs, 'create', 1); | 137 tasks.instrumentApiFunction(chrome.tabs, 'create', 1); |
| 140 tasks.instrumentApiFunction(storage, 'get', 1); | 138 tasks.instrumentApiFunction(storage, 'get', 1); |
| 141 | 139 |
| 142 var updateCardsAttempts = buildAttemptManager( | 140 var updateCardsAttempts = buildAttemptManager( |
| 143 'cards-update', | 141 'cards-update', |
| 144 requestLocation, | 142 requestLocation, |
| 145 INITIAL_POLLING_PERIOD_SECONDS, | 143 INITIAL_POLLING_PERIOD_SECONDS, |
| 146 MAXIMUM_POLLING_PERIOD_SECONDS); | 144 MAXIMUM_POLLING_PERIOD_SECONDS); |
| 147 var dismissalAttempts = buildAttemptManager( | 145 var dismissalAttempts = buildAttemptManager( |
| 148 'dismiss', | 146 'dismiss', |
| 149 retryPendingDismissals, | 147 retryPendingDismissals, |
| 150 INITIAL_RETRY_DISMISS_PERIOD_SECONDS, | 148 INITIAL_RETRY_DISMISS_PERIOD_SECONDS, |
| 151 MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS); | 149 MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS); |
| 152 var cardSet = buildCardSet(); | 150 var cardSet = buildCardSet(); |
| 153 | 151 |
| 152 var authenticationManager = buildAuthenticationManager(); | |
| 153 | |
| 154 /** | 154 /** |
| 155 * Google Now UMA event identifier. | 155 * Google Now UMA event identifier. |
| 156 * @enum {number} | 156 * @enum {number} |
| 157 */ | 157 */ |
| 158 var GoogleNowEvent = { | 158 var GoogleNowEvent = { |
| 159 REQUEST_FOR_CARDS_TOTAL: 0, | 159 REQUEST_FOR_CARDS_TOTAL: 0, |
| 160 REQUEST_FOR_CARDS_SUCCESS: 1, | 160 REQUEST_FOR_CARDS_SUCCESS: 1, |
| 161 CARDS_PARSE_SUCCESS: 2, | 161 CARDS_PARSE_SUCCESS: 2, |
| 162 DISMISS_REQUEST_TOTAL: 3, | 162 DISMISS_REQUEST_TOTAL: 3, |
| 163 DISMISS_REQUEST_SUCCESS: 4, | 163 DISMISS_REQUEST_SUCCESS: 4, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 186 | 186 |
| 187 chrome.metricsPrivate.recordValue(metricDescription, event); | 187 chrome.metricsPrivate.recordValue(metricDescription, event); |
| 188 } | 188 } |
| 189 | 189 |
| 190 /** | 190 /** |
| 191 * Adds authorization behavior to the request. | 191 * Adds authorization behavior to the request. |
| 192 * @param {XMLHttpRequest} request Server request. | 192 * @param {XMLHttpRequest} request Server request. |
| 193 * @param {function(boolean)} callbackBoolean Completion callback with 'success' | 193 * @param {function(boolean)} callbackBoolean Completion callback with 'success' |
| 194 * parameter. | 194 * parameter. |
| 195 */ | 195 */ |
| 196 function setAuthorization(request, callbackBoolean) { | 196 function setAuthorization(request, callbackBoolean) { |
|
vadimt
2013/07/30 23:27:23
Why not move the whole setAuthorization into authe
robliao
2013/07/30 23:58:03
I wanted to keep the HTTP portion out of the ident
| |
| 197 tasks.debugSetStepName('setAuthorization-getAuthToken'); | 197 tasks.debugSetStepName('setAuthorization-isSignedIn'); |
| 198 chrome.identity.getAuthToken({interactive: false}, function(token) { | 198 authenticationManager.isSignedIn(function(signedIn, token) { |
| 199 var errorMessage = | 199 if (!signedIn) { |
| 200 chrome.runtime.lastError && chrome.runtime.lastError.message; | |
| 201 console.log('setAuthorization: error=' + errorMessage + | |
| 202 ', token=' + (token && 'non-empty')); | |
| 203 if (chrome.runtime.lastError || !token) { | |
| 204 callbackBoolean(false); | 200 callbackBoolean(false); |
| 205 return; | 201 return; |
| 206 } | 202 } |
| 207 | 203 |
| 208 request.setRequestHeader('Authorization', 'Bearer ' + token); | 204 request.setRequestHeader('Authorization', 'Bearer ' + token); |
| 209 | 205 |
| 210 // Instrument onloadend to remove stale auth tokens. | 206 // Instrument onloadend to remove stale auth tokens. |
| 211 var originalOnLoadEnd = request.onloadend; | 207 var originalOnLoadEnd = request.onloadend; |
| 212 request.onloadend = tasks.wrapCallback(function(event) { | 208 request.onloadend = tasks.wrapCallback(function(event) { |
| 213 if (request.status == HTTP_FORBIDDEN || | 209 if (request.status == HTTP_FORBIDDEN || |
| 214 request.status == HTTP_UNAUTHORIZED) { | 210 request.status == HTTP_UNAUTHORIZED) { |
| 215 tasks.debugSetStepName('setAuthorization-removeCachedAuthToken'); | 211 tasks.debugSetStepName('setAuthorization-removeToken'); |
| 216 chrome.identity.removeCachedAuthToken({token: token}, function() { | 212 authenticationManager.removeToken(token, function() { |
| 217 // After purging the token cache, call getAuthToken() again to let | |
| 218 // Chrome know about the problem with the token. | |
| 219 chrome.identity.getAuthToken({interactive: false}, function() {}); | |
| 220 originalOnLoadEnd(event); | 213 originalOnLoadEnd(event); |
| 221 }); | 214 }); |
| 222 } else { | 215 } else { |
| 223 originalOnLoadEnd(event); | 216 originalOnLoadEnd(event); |
| 224 } | 217 } |
| 225 }); | 218 }); |
| 226 | 219 |
| 227 callbackBoolean(true); | 220 callbackBoolean(true); |
| 228 }); | 221 }); |
| 229 } | 222 } |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 setShouldPollCards(shouldPollCards, callback); | 778 setShouldPollCards(shouldPollCards, callback); |
| 786 }); | 779 }); |
| 787 } | 780 } |
| 788 | 781 |
| 789 /** | 782 /** |
| 790 * Coordinates the behavior of Google Now for Chrome depending on | 783 * Coordinates the behavior of Google Now for Chrome depending on |
| 791 * Chrome and extension state. | 784 * Chrome and extension state. |
| 792 */ | 785 */ |
| 793 function onStateChange() { | 786 function onStateChange() { |
| 794 tasks.add(STATE_CHANGED_TASK_NAME, function(callback) { | 787 tasks.add(STATE_CHANGED_TASK_NAME, function(callback) { |
| 795 tasks.debugSetStepName('onStateChange-getAuthToken'); | 788 tasks.debugSetStepName('onStateChange-isSignedIn'); |
| 796 chrome.identity.getAuthToken({interactive: false}, function(token) { | 789 authenticationManager.isSignedIn(function(signedIn) { |
| 797 var signedIn = | 790 signedIn = signedIn && !!NOTIFICATION_CARDS_URL; |
| 798 !chrome.runtime.lastError && | |
| 799 token && | |
| 800 !!NOTIFICATION_CARDS_URL; | |
| 801 tasks.debugSetStepName( | 791 tasks.debugSetStepName( |
| 802 'onStateChange-get-googleGeolocationAccessEnabledPref'); | 792 'onStateChange-get-googleGeolocationAccessEnabledPref'); |
| 803 googleGeolocationAccessEnabledPref.get({}, function(prefValue) { | 793 googleGeolocationAccessEnabledPref.get({}, function(prefValue) { |
| 804 var geolocationEnabled = !!prefValue.value; | 794 var geolocationEnabled = !!prefValue.value; |
| 805 tasks.debugSetStepName( | 795 tasks.debugSetStepName( |
| 806 'onStateChange-get-userRespondedToToast'); | 796 'onStateChange-get-userRespondedToToast'); |
| 807 storage.get('userRespondedToToast', function(items) { | 797 storage.get('userRespondedToToast', function(items) { |
| 808 var userRespondedToToast = !!items.userRespondedToToast; | 798 var userRespondedToToast = !!items.userRespondedToToast; |
| 809 updateRunningState( | 799 updateRunningState( |
| 810 signedIn, | 800 signedIn, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 858 chrome.runtime.onStartup.addListener(function() { | 848 chrome.runtime.onStartup.addListener(function() { |
| 859 console.log('onStartup'); | 849 console.log('onStartup'); |
| 860 initialize(); | 850 initialize(); |
| 861 }); | 851 }); |
| 862 | 852 |
| 863 googleGeolocationAccessEnabledPref.onChange.addListener(function(prefValue) { | 853 googleGeolocationAccessEnabledPref.onChange.addListener(function(prefValue) { |
| 864 console.log('googleGeolocationAccessEnabledPref onChange ' + prefValue.value); | 854 console.log('googleGeolocationAccessEnabledPref onChange ' + prefValue.value); |
| 865 onStateChange(); | 855 onStateChange(); |
| 866 }); | 856 }); |
| 867 | 857 |
| 858 authenticationManager.addListener(function() { | |
| 859 console.log('signIn State Change'); | |
| 860 onStateChange(); | |
| 861 }); | |
| 862 | |
| 868 chrome.notifications.onClicked.addListener( | 863 chrome.notifications.onClicked.addListener( |
| 869 function(notificationId) { | 864 function(notificationId) { |
| 870 chrome.metricsPrivate.recordUserAction('GoogleNow.MessageClicked'); | 865 chrome.metricsPrivate.recordUserAction('GoogleNow.MessageClicked'); |
| 871 onNotificationClicked(notificationId, function(actionUrls) { | 866 onNotificationClicked(notificationId, function(actionUrls) { |
| 872 return actionUrls.messageUrl; | 867 return actionUrls.messageUrl; |
| 873 }); | 868 }); |
| 874 }); | 869 }); |
| 875 | 870 |
| 876 chrome.notifications.onButtonClicked.addListener( | 871 chrome.notifications.onButtonClicked.addListener( |
| 877 function(notificationId, buttonIndex) { | 872 function(notificationId, buttonIndex) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 893 | 888 |
| 894 chrome.location.onLocationUpdate.addListener(function(position) { | 889 chrome.location.onLocationUpdate.addListener(function(position) { |
| 895 recordEvent(GoogleNowEvent.LOCATION_UPDATE); | 890 recordEvent(GoogleNowEvent.LOCATION_UPDATE); |
| 896 updateNotificationsCards(position); | 891 updateNotificationsCards(position); |
| 897 }); | 892 }); |
| 898 | 893 |
| 899 chrome.omnibox.onInputEntered.addListener(function(text) { | 894 chrome.omnibox.onInputEntered.addListener(function(text) { |
| 900 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; | 895 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; |
| 901 initialize(); | 896 initialize(); |
| 902 }); | 897 }); |
| OLD | NEW |