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 Utility objects and functions for Google Now extension. | 8 * @fileoverview Utility objects and functions for Google Now extension. |
| 9 * Most important entities here: | 9 * Most important entities here: |
| 10 * (1) 'wrapper' is a module used to add error handling and other services to | 10 * (1) 'wrapper' is a module used to add error handling and other services to |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 // TODO(vadimt): Use server name in the manifest. | 25 // TODO(vadimt): Use server name in the manifest. |
| 26 | 26 |
| 27 /** | 27 /** |
| 28 * Notification server URL. | 28 * Notification server URL. |
| 29 */ | 29 */ |
| 30 var NOTIFICATION_CARDS_URL = 'https://www.googleapis.com/chromenow/v1'; | 30 var NOTIFICATION_CARDS_URL = 'https://www.googleapis.com/chromenow/v1'; |
| 31 | 31 |
| 32 /** | 32 /** |
| 33 * GCM registration URL. | |
| 34 */ | |
| 35 var GCM_REGISTRATION_URL = | |
| 36 'https://android.googleapis.com/gcm/googlenotification'; | |
| 37 | |
| 38 /** | |
| 39 * DevConsole project ID for GCM API use. | |
| 40 */ | |
| 41 var GCM_PROJECT_ID = '437902709571'; | |
| 42 | |
| 43 /** | |
| 33 * Returns true if debug mode is enabled. | 44 * Returns true if debug mode is enabled. |
| 34 * localStorage returns items as strings, which means if we store a boolean, | 45 * localStorage returns items as strings, which means if we store a boolean, |
| 35 * it returns a string. Use this function to compare against true. | 46 * it returns a string. Use this function to compare against true. |
| 36 * @return {boolean} Whether debug mode is enabled. | 47 * @return {boolean} Whether debug mode is enabled. |
| 37 */ | 48 */ |
| 38 function isInDebugMode() { | 49 function isInDebugMode() { |
| 39 return localStorage.debug_mode === 'true'; | 50 return localStorage.debug_mode === 'true'; |
| 40 } | 51 } |
| 41 | 52 |
| 42 /** | 53 /** |
| (...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1052 // One hour is just an arbitrary amount of time chosen. | 1063 // One hour is just an arbitrary amount of time chosen. |
| 1053 chrome.alarms.create(alarmName, {periodInMinutes: 60}); | 1064 chrome.alarms.create(alarmName, {periodInMinutes: 60}); |
| 1054 | 1065 |
| 1055 return { | 1066 return { |
| 1056 addListener: addListener, | 1067 addListener: addListener, |
| 1057 getAuthToken: getAuthToken, | 1068 getAuthToken: getAuthToken, |
| 1058 isSignedIn: isSignedIn, | 1069 isSignedIn: isSignedIn, |
| 1059 removeToken: removeToken | 1070 removeToken: removeToken |
| 1060 }; | 1071 }; |
| 1061 } | 1072 } |
| 1073 | |
| 1074 /** | |
| 1075 * Ensures the extension is ready to listen for GCM messages. | |
| 1076 */ | |
| 1077 function registerForGcm() { | |
| 1078 // We don't need to use the key at this point, just ensure it's set up, | |
| 1079 getGcmNotificationKey().then(function(unusedKey) {}); | |
| 1080 } | |
| 1081 | |
| 1082 /** | |
| 1083 * Returns a Promise resolving to either a cached or new GCM notification key. | |
| 1084 * Rejects if registration fails. | |
| 1085 * @return {Promise} A Promise that resolves to a potentially-cached GCM key. | |
| 1086 */ | |
| 1087 function getGcmNotificationKey() { | |
| 1088 return fillFromChromeLocalStorage({gcmNotificationKey: undefined}) | |
| 1089 .then(function(items) { | |
| 1090 return new Promise(function(resolve, reject) { | |
| 1091 if (items.gcmNotificationKey) { | |
| 1092 console.log('reused gcm key from storage.'); | |
| 1093 resolve(items.gcmNotificationKey); | |
| 1094 } else { | |
| 1095 requestNewGcmNotificationKey().then(function(key) { | |
| 1096 resolve(key); | |
| 1097 }).catch(function() { | |
| 1098 reject(); | |
|
robliao
2015/02/18 00:04:25
I think this can be written as...
fillFromChromeL
skare_
2015/02/19 16:48:10
yes it can. thanks, done.
| |
| 1099 }); | |
| 1100 } | |
| 1101 }); | |
| 1102 }); | |
| 1103 } | |
| 1104 | |
| 1105 /** | |
| 1106 * Determines the active account's username. | |
| 1107 * @return {Promise} A promise to determine the current account's username. | |
| 1108 */ | |
| 1109 function getUsername() { | |
|
robliao
2015/02/18 00:04:25
Would it make sense to have the authentication man
skare_
2015/02/19 16:48:10
Done.
| |
| 1110 return new Promise(function(resolve) { | |
| 1111 instrumented.webstorePrivate.getBrowserLogin(function(accountInfo) { | |
| 1112 resolve(accountInfo.login); | |
| 1113 }); | |
| 1114 }); | |
| 1115 } | |
| 1116 | |
| 1117 /** | |
| 1118 * Returns a promise resolving to a GCM Notificaiton Key. May call | |
| 1119 * chrome.gcm.register() first if required. Rejects on registration failure. | |
| 1120 * @return {Promise} A Promise that resolves to a fresh GCM Notification key. | |
| 1121 */ | |
| 1122 function requestNewGcmNotificationKey() { | |
| 1123 return getGcmRegistrationId().then(function(gcmId) { | |
| 1124 authenticationManager.getAuthToken().then(function(token) { | |
| 1125 getUsername().then(function(username) { | |
| 1126 return new Promise(function(resolve, reject) { | |
| 1127 var xhr = new XMLHttpRequest(); | |
| 1128 xhr.responseType = 'text'; | |
| 1129 xhr.open('POST', GCM_REGISTRATION_URL, true); | |
| 1130 xhr.setRequestHeader('Content-Type', 'application/json'); | |
| 1131 xhr.setRequestHeader('Authorization', 'Bearer ' + token); | |
| 1132 xhr.setRequestHeader('project_id', GCM_PROJECT_ID); | |
| 1133 var payload = { | |
| 1134 'operation': 'add', | |
| 1135 'notification_key_name': username, | |
| 1136 'registration_ids': [gcmId] | |
| 1137 }; | |
| 1138 xhr.onloadend = function() { | |
| 1139 if (xhr.status != 200) { | |
| 1140 reject(); | |
| 1141 } | |
| 1142 var obj = JSON.parse(xhr.responseText); | |
| 1143 var key = obj && obj.notification_key; | |
| 1144 if (!key) { | |
| 1145 reject(); | |
| 1146 } | |
| 1147 console.log('gcm notification key POST: ' + key); | |
| 1148 chrome.storage.local.set({gcmNotificationKey: key}); | |
| 1149 resolve(key); | |
| 1150 }; | |
| 1151 xhr.send(JSON.stringify(payload)); | |
| 1152 }); | |
| 1153 }); | |
| 1154 }).catch(function() { | |
| 1155 // Couldn't obtain a GCM ID. Ignore and fallback to polling. | |
| 1156 }); | |
| 1157 }); | |
| 1158 } | |
| 1159 | |
| 1160 /** | |
| 1161 * Returns a promise resolving to either a cached or new GCM registration ID. | |
| 1162 * Rejects if registration fails. | |
| 1163 * @return {Promise} A Promise that resolves to a GCM registration ID. | |
| 1164 */ | |
| 1165 function getGcmRegistrationId() { | |
| 1166 return fillFromChromeLocalStorage({gcmRegistrationId: undefined}) | |
| 1167 .then(function(items) { | |
|
robliao
2015/02/18 00:04:25
OPTIONAL, since it doesn't really buy that much: S
skare_
2015/02/19 16:48:10
Done. Gets rid of an else and some spaces which is
| |
| 1168 return new Promise(function(resolve, reject) { | |
| 1169 if (items.gcmRegistrationId) { | |
| 1170 console.log('reused gcm registration id from storage.'); | |
| 1171 resolve(items.gcmRegistrationId); | |
| 1172 } else { | |
| 1173 chrome.gcm.register([GCM_PROJECT_ID], function(registrationId) { | |
| 1174 console.log('gcm.register(): ' + registrationId); | |
| 1175 if (registrationId) { | |
| 1176 chrome.storage.local.set({gcmRegistrationId: registrationId}); | |
| 1177 resolve(registrationId); | |
| 1178 } else { | |
| 1179 reject(); | |
| 1180 } | |
| 1181 }); | |
| 1182 } | |
| 1183 }); | |
| 1184 }); | |
| 1185 } | |
| OLD | NEW |