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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 wrapper.instrumentChromeApiFunction('notifications.onClicked.addListener', 0); | 161 wrapper.instrumentChromeApiFunction('notifications.onClicked.addListener', 0); |
162 wrapper.instrumentChromeApiFunction('notifications.onClosed.addListener', 0); | 162 wrapper.instrumentChromeApiFunction('notifications.onClosed.addListener', 0); |
163 wrapper.instrumentChromeApiFunction('omnibox.onInputEntered.addListener', 0); | 163 wrapper.instrumentChromeApiFunction('omnibox.onInputEntered.addListener', 0); |
164 wrapper.instrumentChromeApiFunction( | 164 wrapper.instrumentChromeApiFunction( |
165 'preferencesPrivate.googleGeolocationAccessEnabled.get', | 165 'preferencesPrivate.googleGeolocationAccessEnabled.get', |
166 1); | 166 1); |
167 wrapper.instrumentChromeApiFunction( | 167 wrapper.instrumentChromeApiFunction( |
168 'preferencesPrivate.googleGeolocationAccessEnabled.onChange.addListener', | 168 'preferencesPrivate.googleGeolocationAccessEnabled.onChange.addListener', |
169 0); | 169 0); |
170 wrapper.instrumentChromeApiFunction('permissions.contains', 1); | 170 wrapper.instrumentChromeApiFunction('permissions.contains', 1); |
171 wrapper.instrumentChromeApiFunction('permissions.remove', 1); | |
172 wrapper.instrumentChromeApiFunction('permissions.request', 1); | |
173 wrapper.instrumentChromeApiFunction('runtime.onInstalled.addListener', 0); | 171 wrapper.instrumentChromeApiFunction('runtime.onInstalled.addListener', 0); |
174 wrapper.instrumentChromeApiFunction('runtime.onStartup.addListener', 0); | 172 wrapper.instrumentChromeApiFunction('runtime.onStartup.addListener', 0); |
175 wrapper.instrumentChromeApiFunction('tabs.create', 1); | 173 wrapper.instrumentChromeApiFunction('tabs.create', 1); |
176 wrapper.instrumentChromeApiFunction('storage.local.get', 1); | 174 wrapper.instrumentChromeApiFunction('storage.local.get', 1); |
177 | 175 |
178 var updateCardsAttempts = buildAttemptManager( | 176 var updateCardsAttempts = buildAttemptManager( |
179 'cards-update', | 177 'cards-update', |
180 requestLocation, | 178 requestLocation, |
181 INITIAL_POLLING_PERIOD_SECONDS, | 179 INITIAL_POLLING_PERIOD_SECONDS, |
182 MAXIMUM_POLLING_PERIOD_SECONDS); | 180 MAXIMUM_POLLING_PERIOD_SECONDS); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 * @param {Object.<string, MergedCard>} cards Map from chromeNotificationId to | 260 * @param {Object.<string, MergedCard>} cards Map from chromeNotificationId to |
263 * the merged card, containing cards to show. | 261 * the merged card, containing cards to show. |
264 */ | 262 */ |
265 function showNotificationCards(cards) { | 263 function showNotificationCards(cards) { |
266 console.log('showNotificationCards ' + JSON.stringify(cards)); | 264 console.log('showNotificationCards ' + JSON.stringify(cards)); |
267 | 265 |
268 instrumented.storage.local.get(['notificationsData', 'recentDismissals'], | 266 instrumented.storage.local.get(['notificationsData', 'recentDismissals'], |
269 function(items) { | 267 function(items) { |
270 console.log('showNotificationCards-get ' + | 268 console.log('showNotificationCards-get ' + |
271 JSON.stringify(items)); | 269 JSON.stringify(items)); |
| 270 items = items || {}; |
272 items.notificationsData = items.notificationsData || {}; | 271 items.notificationsData = items.notificationsData || {}; |
273 items.recentDismissals = items.recentDismissals || {}; | 272 items.recentDismissals = items.recentDismissals || {}; |
274 | 273 |
275 instrumented.notifications.getAll(function(notifications) { | 274 instrumented.notifications.getAll(function(notifications) { |
276 console.log('showNotificationCards-getAll ' + | 275 console.log('showNotificationCards-getAll ' + |
277 JSON.stringify(notifications)); | 276 JSON.stringify(notifications)); |
278 // TODO(vadimt): Figure out what to do when notifications are | 277 // TODO(vadimt): Figure out what to do when notifications are |
279 // disabled for our extension. | 278 // disabled for our extension. |
280 notifications = notifications || {}; | 279 notifications = notifications || {}; |
281 | 280 |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 for (var i = 0; i != parsedResponse.notifications.length; ++i) { | 462 for (var i = 0; i != parsedResponse.notifications.length; ++i) { |
464 var card = parsedResponse.notifications[i]; | 463 var card = parsedResponse.notifications[i]; |
465 var group = groups[card.groupName]; | 464 var group = groups[card.groupName]; |
466 group.cards = group.cards || []; | 465 group.cards = group.cards || []; |
467 group.cards.push(card); | 466 group.cards.push(card); |
468 } | 467 } |
469 } | 468 } |
470 | 469 |
471 instrumented.storage.local.get('notificationGroups', function(items) { | 470 instrumented.storage.local.get('notificationGroups', function(items) { |
472 console.log('parseAndShowNotificationCards-get ' + JSON.stringify(items)); | 471 console.log('parseAndShowNotificationCards-get ' + JSON.stringify(items)); |
| 472 items = items || {}; |
473 items.notificationGroups = items.notificationGroups || {}; | 473 items.notificationGroups = items.notificationGroups || {}; |
474 | 474 |
475 var now = Date.now(); | 475 var now = Date.now(); |
476 | 476 |
477 // Build updated set of groups and merge cards from all groups into one set. | 477 // Build updated set of groups and merge cards from all groups into one set. |
478 var updatedGroups = {}; | 478 var updatedGroups = {}; |
479 var mergedCards = {}; | 479 var mergedCards = {}; |
480 | 480 |
481 for (var groupName in groups) { | 481 for (var groupName in groups) { |
482 var receivedGroup = groups[groupName]; | 482 var receivedGroup = groups[groupName]; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 ' from ' + NOTIFICATION_CARDS_URL); | 523 ' from ' + NOTIFICATION_CARDS_URL); |
524 | 524 |
525 if (!NOTIFICATION_CARDS_URL) | 525 if (!NOTIFICATION_CARDS_URL) |
526 return; | 526 return; |
527 | 527 |
528 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); | 528 recordEvent(GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
529 | 529 |
530 instrumented.storage.local.get('notificationGroups', function(items) { | 530 instrumented.storage.local.get('notificationGroups', function(items) { |
531 console.log('requestNotificationCards-storage-get ' + | 531 console.log('requestNotificationCards-storage-get ' + |
532 JSON.stringify(items)); | 532 JSON.stringify(items)); |
| 533 items = items || {}; |
533 | 534 |
534 var requestParameters = '?timeZoneOffsetMs=' + | 535 var requestParameters = '?timeZoneOffsetMs=' + |
535 (-new Date().getTimezoneOffset() * MS_IN_MINUTE); | 536 (-new Date().getTimezoneOffset() * MS_IN_MINUTE); |
536 | 537 |
537 if (items.notificationGroups) { | 538 if (items.notificationGroups) { |
538 var now = Date.now(); | 539 var now = Date.now(); |
539 | 540 |
540 for (var groupName in items.notificationGroups) { | 541 for (var groupName in items.notificationGroups) { |
541 var group = items.notificationGroups[groupName]; | 542 var group = items.notificationGroups[groupName]; |
542 if (group.nextPollTime <= now) | 543 if (group.nextPollTime <= now) |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 /** | 683 /** |
683 * Tries to send dismiss requests for all pending dismissals. | 684 * Tries to send dismiss requests for all pending dismissals. |
684 * @param {function(boolean)} callbackBoolean Completion callback with 'success' | 685 * @param {function(boolean)} callbackBoolean Completion callback with 'success' |
685 * parameter. Success means that no pending dismissals are left. | 686 * parameter. Success means that no pending dismissals are left. |
686 */ | 687 */ |
687 function processPendingDismissals(callbackBoolean) { | 688 function processPendingDismissals(callbackBoolean) { |
688 instrumented.storage.local.get(['pendingDismissals', 'recentDismissals'], | 689 instrumented.storage.local.get(['pendingDismissals', 'recentDismissals'], |
689 function(items) { | 690 function(items) { |
690 console.log('processPendingDismissals-storage-get ' + | 691 console.log('processPendingDismissals-storage-get ' + |
691 JSON.stringify(items)); | 692 JSON.stringify(items)); |
| 693 items = items || {}; |
692 items.pendingDismissals = items.pendingDismissals || []; | 694 items.pendingDismissals = items.pendingDismissals || []; |
693 items.recentDismissals = items.recentDismissals || {}; | 695 items.recentDismissals = items.recentDismissals || {}; |
694 | 696 |
695 var dismissalsChanged = false; | 697 var dismissalsChanged = false; |
696 | 698 |
697 function onFinish(success) { | 699 function onFinish(success) { |
698 if (dismissalsChanged) { | 700 if (dismissalsChanged) { |
699 chrome.storage.local.set({ | 701 chrome.storage.local.set({ |
700 pendingDismissals: items.pendingDismissals, | 702 pendingDismissals: items.pendingDismissals, |
701 recentDismissals: items.recentDismissals | 703 recentDismissals: items.recentDismissals |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 } | 812 } |
811 | 813 |
812 // At this point we are guaranteed that the notification is a now card. | 814 // At this point we are guaranteed that the notification is a now card. |
813 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); | 815 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); |
814 | 816 |
815 tasks.add(DISMISS_CARD_TASK_NAME, function() { | 817 tasks.add(DISMISS_CARD_TASK_NAME, function() { |
816 dismissalAttempts.start(); | 818 dismissalAttempts.start(); |
817 | 819 |
818 instrumented.storage.local.get( | 820 instrumented.storage.local.get( |
819 ['pendingDismissals', 'notificationsData'], function(items) { | 821 ['pendingDismissals', 'notificationsData'], function(items) { |
| 822 items = items || {}; |
820 items.pendingDismissals = items.pendingDismissals || []; | 823 items.pendingDismissals = items.pendingDismissals || []; |
821 items.notificationsData = items.notificationsData || {}; | 824 items.notificationsData = items.notificationsData || {}; |
822 | 825 |
823 // Deleting the notification in case it was re-added while this task was | 826 // Deleting the notification in case it was re-added while this task was |
824 // scheduled, waiting for execution; also cleaning notification's data | 827 // scheduled, waiting for execution; also cleaning notification's data |
825 // from storage. | 828 // from storage. |
826 cardSet.clear(chromeNotificationId, true); | 829 cardSet.clear(chromeNotificationId, true); |
827 | 830 |
828 var notificationData = items.notificationsData[chromeNotificationId]; | 831 var notificationData = items.notificationsData[chromeNotificationId]; |
829 | 832 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 // determine if we are already running). To mitigate this, we will | 882 // determine if we are already running). To mitigate this, we will |
880 // shut everything down on initialize before starting everything up. | 883 // shut everything down on initialize before starting everything up. |
881 stopPollingCards(); | 884 stopPollingCards(); |
882 onStateChange(); | 885 onStateChange(); |
883 } | 886 } |
884 | 887 |
885 /** | 888 /** |
886 * Starts or stops the polling of cards. | 889 * Starts or stops the polling of cards. |
887 * @param {boolean} shouldPollCardsRequest true to start and | 890 * @param {boolean} shouldPollCardsRequest true to start and |
888 * false to stop polling cards. | 891 * false to stop polling cards. |
889 * @param {function} callback Called on completion. | |
890 */ | 892 */ |
891 function setShouldPollCards(shouldPollCardsRequest, callback) { | 893 function setShouldPollCards(shouldPollCardsRequest) { |
892 tasks.debugSetStepName( | |
893 'setShouldRun-shouldRun-updateCardsAttemptsIsRunning'); | |
894 updateCardsAttempts.isRunning(function(currentValue) { | 894 updateCardsAttempts.isRunning(function(currentValue) { |
895 if (shouldPollCardsRequest != currentValue) { | 895 if (shouldPollCardsRequest != currentValue) { |
896 console.log('Action Taken setShouldPollCards=' + shouldPollCardsRequest); | 896 console.log('Action Taken setShouldPollCards=' + shouldPollCardsRequest); |
897 if (shouldPollCardsRequest) | 897 if (shouldPollCardsRequest) |
898 startPollingCards(); | 898 startPollingCards(); |
899 else | 899 else |
900 stopPollingCards(); | 900 stopPollingCards(); |
901 } else { | 901 } else { |
902 console.log( | 902 console.log( |
903 'Action Ignored setShouldPollCards=' + shouldPollCardsRequest); | 903 'Action Ignored setShouldPollCards=' + shouldPollCardsRequest); |
904 } | 904 } |
905 callback(); | |
906 }); | 905 }); |
907 } | 906 } |
908 | 907 |
909 /** | 908 /** |
910 * Shows or hides the toast. | 909 * Shows or hides the toast. |
911 * @param {boolean} visibleRequest true to show the toast and | 910 * @param {boolean} visibleRequest true to show the toast and |
912 * false to hide the toast. | 911 * false to hide the toast. |
913 * @param {function} callback Called on completion. | |
914 */ | 912 */ |
915 function setToastVisible(visibleRequest, callback) { | 913 function setToastVisible(visibleRequest) { |
916 tasks.debugSetStepName( | |
917 'setToastVisible-shouldSetToastVisible-getAllNotifications'); | |
918 instrumented.notifications.getAll(function(notifications) { | 914 instrumented.notifications.getAll(function(notifications) { |
919 // TODO(vadimt): Figure out what to do when notifications are disabled for | 915 // TODO(vadimt): Figure out what to do when notifications are disabled for |
920 // our extension. | 916 // our extension. |
921 notifications = notifications || {}; | 917 notifications = notifications || {}; |
922 | 918 |
923 if (visibleRequest != !!notifications[WELCOME_TOAST_NOTIFICATION_ID]) { | 919 if (visibleRequest != !!notifications[WELCOME_TOAST_NOTIFICATION_ID]) { |
924 console.log('Action Taken setToastVisible=' + visibleRequest); | 920 console.log('Action Taken setToastVisible=' + visibleRequest); |
925 if (visibleRequest) | 921 if (visibleRequest) |
926 showWelcomeToast(); | 922 showWelcomeToast(); |
927 else | 923 else |
928 hideWelcomeToast(); | 924 hideWelcomeToast(); |
929 } else { | 925 } else { |
930 console.log('Action Ignored setToastVisible=' + visibleRequest); | 926 console.log('Action Ignored setToastVisible=' + visibleRequest); |
931 } | 927 } |
932 | |
933 callback(); | |
934 }); | 928 }); |
935 } | 929 } |
936 | 930 |
937 /** | 931 /** |
938 * Enables or disables the Google Now background permission. | 932 * Enables or disables the Google Now background permission. |
939 * @param {boolean} backgroundEnable true to run in the background. | 933 * @param {boolean} backgroundEnable true to run in the background. |
940 * false to not run in the background. | 934 * false to not run in the background. |
941 * @param {function} callback Called on completion. | |
942 */ | 935 */ |
943 function setBackgroundEnable(backgroundEnable, callback) { | 936 function setBackgroundEnable(backgroundEnable) { |
944 instrumented.permissions.contains({permissions: ['background']}, | 937 instrumented.permissions.contains({permissions: ['background']}, |
945 function(hasPermission) { | 938 function(hasPermission) { |
946 if (backgroundEnable != hasPermission) { | 939 if (backgroundEnable != hasPermission) { |
947 console.log('Action Taken setBackgroundEnable=' + backgroundEnable); | 940 console.log('Action Taken setBackgroundEnable=' + backgroundEnable); |
948 if (backgroundEnable) | 941 if (backgroundEnable) |
949 instrumented.permissions.request( | 942 chrome.permissions.request({permissions: ['background']}); |
950 {permissions: ['background']}, | |
951 function() { | |
952 callback(); | |
953 }); | |
954 else | 943 else |
955 instrumented.permissions.remove( | 944 chrome.permissions.remove({permissions: ['background']}); |
956 {permissions: ['background']}, | |
957 function() { | |
958 callback(); | |
959 }); | |
960 } else { | 945 } else { |
961 console.log('Action Ignored setBackgroundEnable=' + backgroundEnable); | 946 console.log('Action Ignored setBackgroundEnable=' + backgroundEnable); |
962 callback(); | |
963 } | 947 } |
964 }); | 948 }); |
965 } | 949 } |
966 | 950 |
967 /** | 951 /** |
968 * Does the actual work of deciding what Google Now should do | 952 * Does the actual work of deciding what Google Now should do |
969 * based off of the current state of Chrome. | 953 * based off of the current state of Chrome. |
970 * @param {boolean} signedIn true if the user is signed in. | 954 * @param {boolean} signedIn true if the user is signed in. |
971 * @param {boolean} geolocationEnabled true if | 955 * @param {boolean} geolocationEnabled true if |
972 * the geolocation option is enabled. | 956 * the geolocation option is enabled. |
973 * @param {boolean} userRespondedToToast true if | 957 * @param {boolean} userRespondedToToast true if |
974 * the user has responded to the toast. | 958 * the user has responded to the toast. |
975 * @param {boolean} enableBackground true if | 959 * @param {boolean} enableBackground true if |
976 * the background permission should be requested. | 960 * the background permission should be requested. |
977 * @param {function()} callback Call this function on completion. | |
978 */ | 961 */ |
979 function updateRunningState( | 962 function updateRunningState( |
980 signedIn, | 963 signedIn, |
981 geolocationEnabled, | 964 geolocationEnabled, |
982 userRespondedToToast, | 965 userRespondedToToast, |
983 enableBackground, | 966 enableBackground) { |
984 callback) { | |
985 console.log( | 967 console.log( |
986 'State Update signedIn=' + signedIn + ' ' + | 968 'State Update signedIn=' + signedIn + ' ' + |
987 'geolocationEnabled=' + geolocationEnabled + ' ' + | 969 'geolocationEnabled=' + geolocationEnabled + ' ' + |
988 'userRespondedToToast=' + userRespondedToToast); | 970 'userRespondedToToast=' + userRespondedToToast); |
989 | 971 |
990 // TODO(vadimt): Remove this line once state machine design is finalized. | 972 // TODO(vadimt): Remove this line once state machine design is finalized. |
991 geolocationEnabled = userRespondedToToast = true; | 973 geolocationEnabled = userRespondedToToast = true; |
992 | 974 |
993 var shouldSetToastVisible = false; | 975 var shouldSetToastVisible = false; |
994 var shouldPollCards = false; | 976 var shouldPollCards = false; |
(...skipping 21 matching lines...) Expand all Loading... |
1016 } | 998 } |
1017 } else { | 999 } else { |
1018 recordEvent(GoogleNowEvent.STOPPED); | 1000 recordEvent(GoogleNowEvent.STOPPED); |
1019 } | 1001 } |
1020 | 1002 |
1021 console.log( | 1003 console.log( |
1022 'Requested Actions shouldSetBackground=' + shouldSetBackground + ' ' + | 1004 'Requested Actions shouldSetBackground=' + shouldSetBackground + ' ' + |
1023 'setToastVisible=' + shouldSetToastVisible + ' ' + | 1005 'setToastVisible=' + shouldSetToastVisible + ' ' + |
1024 'setShouldPollCards=' + shouldPollCards); | 1006 'setShouldPollCards=' + shouldPollCards); |
1025 | 1007 |
1026 setBackgroundEnable(shouldSetBackground, function() { | 1008 setBackgroundEnable(shouldSetBackground); |
1027 setToastVisible(shouldSetToastVisible, function() { | 1009 setToastVisible(shouldSetToastVisible); |
1028 setShouldPollCards(shouldPollCards, callback); | 1010 setShouldPollCards(shouldPollCards); |
1029 }); | |
1030 }); | |
1031 } | 1011 } |
1032 | 1012 |
1033 /** | 1013 /** |
1034 * Coordinates the behavior of Google Now for Chrome depending on | 1014 * Coordinates the behavior of Google Now for Chrome depending on |
1035 * Chrome and extension state. | 1015 * Chrome and extension state. |
1036 */ | 1016 */ |
1037 function onStateChange() { | 1017 function onStateChange() { |
1038 tasks.add(STATE_CHANGED_TASK_NAME, function(callback) { | 1018 tasks.add(STATE_CHANGED_TASK_NAME, function() { |
1039 tasks.debugSetStepName('onStateChange-isSignedIn'); | |
1040 authenticationManager.isSignedIn(function(token) { | 1019 authenticationManager.isSignedIn(function(token) { |
1041 var signedIn = !!token && !!NOTIFICATION_CARDS_URL; | 1020 var signedIn = !!token && !!NOTIFICATION_CARDS_URL; |
1042 instrumented.metricsPrivate.getVariationParams( | 1021 instrumented.metricsPrivate.getVariationParams( |
1043 'GoogleNow', | 1022 'GoogleNow', |
1044 function(response) { | 1023 function(response) { |
1045 var enableBackground = | 1024 var enableBackground = |
1046 (!response || (response.enableBackground != 'false')); | 1025 (!response || (response.enableBackground != 'false')); |
1047 tasks.debugSetStepName( | |
1048 'onStateChange-get-googleGeolocationAccessEnabledPref'); | |
1049 instrumented. | 1026 instrumented. |
1050 preferencesPrivate. | 1027 preferencesPrivate. |
1051 googleGeolocationAccessEnabled. | 1028 googleGeolocationAccessEnabled. |
1052 get({}, function(prefValue) { | 1029 get({}, function(prefValue) { |
1053 var geolocationEnabled = !!prefValue.value; | 1030 var geolocationEnabled = !!prefValue.value; |
1054 tasks.debugSetStepName( | |
1055 'onStateChange-get-userRespondedToToast'); | |
1056 instrumented.storage.local.get( | 1031 instrumented.storage.local.get( |
1057 'userRespondedToToast', | 1032 'userRespondedToToast', |
1058 function(items) { | 1033 function(items) { |
1059 var userRespondedToToast = | 1034 var userRespondedToToast = |
1060 !items || !!items.userRespondedToToast; | 1035 !items || !!items.userRespondedToToast; |
1061 updateRunningState( | 1036 updateRunningState( |
1062 signedIn, | 1037 signedIn, |
1063 geolocationEnabled, | 1038 geolocationEnabled, |
1064 userRespondedToToast, | 1039 userRespondedToToast, |
1065 enableBackground, | 1040 enableBackground); |
1066 callback); | |
1067 }); | 1041 }); |
1068 }); | 1042 }); |
1069 }); | 1043 }); |
1070 }); | 1044 }); |
1071 }); | 1045 }); |
1072 } | 1046 } |
1073 | 1047 |
1074 /** | 1048 /** |
1075 * Displays a toast to the user asking if they want to opt in to receiving | 1049 * Displays a toast to the user asking if they want to opt in to receiving |
1076 * Google Now cards. | 1050 * Google Now cards. |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 | 1130 |
1157 instrumented.location.onLocationUpdate.addListener(function(position) { | 1131 instrumented.location.onLocationUpdate.addListener(function(position) { |
1158 recordEvent(GoogleNowEvent.LOCATION_UPDATE); | 1132 recordEvent(GoogleNowEvent.LOCATION_UPDATE); |
1159 updateNotificationsCards(position); | 1133 updateNotificationsCards(position); |
1160 }); | 1134 }); |
1161 | 1135 |
1162 instrumented.omnibox.onInputEntered.addListener(function(text) { | 1136 instrumented.omnibox.onInputEntered.addListener(function(text) { |
1163 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; | 1137 localStorage['server_url'] = NOTIFICATION_CARDS_URL = text; |
1164 initialize(); | 1138 initialize(); |
1165 }); | 1139 }); |
OLD | NEW |