1- /**
2- * Google Analytics / TestPilot Metrics
3- */
4- const TRACKING_ID = 'UA-35433268-79' ;
51const KINTO_SERVER = 'https://testpilot.settings.services.mozilla.com/v1' ;
62// XXX: Read this from Kinto fxa-params
73const FXA_CLIENT_ID = 'a3dbd8c5a6fd93e2' ;
84const FXA_OAUTH_SERVER = 'https://oauth.accounts.firefox.com/v1' ;
95const FXA_PROFILE_SERVER = 'https://profile.accounts.firefox.com/v1' ;
106const FXA_SCOPES = [ 'profile' , 'https://identity.mozilla.com/apps/notes' ] ;
11- const timeouts = { } ;
12- let closeUI = null ;
137let isEditorReady = false ;
148let editorConnectedDeferred ;
159let isEditorConnected = new Promise ( resolve => { editorConnectedDeferred = { resolve} ; } ) ;
@@ -19,86 +13,6 @@ const client = new Kinto({remote: KINTO_SERVER, bucket: 'default'});
1913// Used by sync to load only changes from lastModified timestamp.
2014let lastSyncTimestamp = null ; // eslint-disable-line no-unused-vars
2115
22- // Analytics
23- const analytics = new TestPilotGA ( {
24- tid : TRACKING_ID ,
25- ds : 'addon' ,
26- an : 'Notes Experiment' ,
27- aid : 'notes@mozilla.com' ,
28- av : browser . runtime . getManifest ( ) . version
29- } ) ;
30-
31- // This object is updated onMessage 'redux', sended by sidebar store.js on every change.
32- // We need to keep it to generate `cd10`
33- let reduxState = { } ;
34-
35- function sendMetrics ( event , context = { } , state = reduxState ) {
36-
37- // This function debounce sending metrics.
38- const later = function ( ) {
39- timeouts [ event ] = null ;
40-
41- let metrics = { } ;
42-
43- if ( event === 'open' ) {
44- metrics . cd9 = context . loaded !== false ;
45- } else if ( event === 'close' ) {
46- metrics . cd7 = context . closeUI ;
47- metrics . cd8 = null ; // reason editing session ended
48- } else if ( event === 'changed' || event === 'drag-n-drop' ) { // Editing
49- metrics = {
50- cm1 : context . characters ,
51- cm2 : context . lineBreaks ,
52- cm3 : null , // Size of the change
53- cd1 : context . syncEnabled ,
54- cd2 : context . usesSize ,
55- cd3 : context . usesBold ,
56- cd4 : context . usesItalics ,
57- cd5 : context . usesStrikethrough ,
58- cd6 : context . usesList ,
59- } ;
60- } else if ( event === 'export' ) {
61- metrics . el = 'html' ;
62- } else if ( event === 'new-note' ) {
63- metrics . el = context . origin ;
64- } else if ( event === 'delete-note' ) {
65- metrics . el = context . origin ;
66- }
67-
68- // Generate cd10 based on footer.js rules
69- if ( state . sync && [ 'open' , 'close' , 'changed' , 'drag-n-drop' , 'new-note' , 'export' ,
70- 'delete-note' , 'give-feedback' , 'limit-reached' ] . includes ( event ) ) {
71- if ( state . sync . email ) { // If user is authenticated
72- if ( state . sync . error ) {
73- metrics . cd10 = 'error' ;
74- } else if ( state . sync . isSyncing ) {
75- metrics . cd10 = 'isSyncing' ;
76- } else {
77- metrics . cd10 = 'synced' ;
78- }
79- } else {
80- if ( state . sync . isOpeningLogin ) { // eslint-disable-line no-lonely-if
81- metrics . cd10 = 'openLogin' ;
82- } else if ( state . sync . isPleaseLogin ) {
83- metrics . cd10 = 'verifyAccount' ;
84- } else if ( state . sync . isReconnectSync ) {
85- metrics . cd10 = 'reconnectSync' ;
86- } else {
87- metrics . cd10 = 'signIn' ;
88- }
89- }
90- }
91-
92- if ( state . notes ) {
93- metrics . cd11 = state . notes . length ;
94- }
95-
96- return analytics . sendEvent ( 'notes' , event , metrics ) ;
97- } ;
98- clearTimeout ( timeouts [ event ] ) ;
99- timeouts [ event ] = setTimeout ( later , 20000 ) ;
100- }
101-
10216function fetchProfile ( credentials ) {
10317 return fxaFetchProfile ( FXA_PROFILE_SERVER , credentials . access_token ) . then ( ( profile ) => {
10418 browser . storage . local . set ( { credentials} ) . then ( ( ) => {
@@ -120,7 +34,6 @@ function authenticate() {
12034 redirectUri : browser . identity . getRedirectURL ( ) ,
12135 scopes : FXA_SCOPES ,
12236 } ) . then ( ( loginDetails ) => {
123- sendMetrics ( 'login-success' ) ;
12437 lastSyncTimestamp = null ;
12538 const key = loginDetails . keys [ 'https://identity.mozilla.com/apps/notes' ] ;
12639 const credentials = {
@@ -141,7 +54,6 @@ function authenticate() {
14154 chrome . runtime . sendMessage ( {
14255 action : 'reconnect'
14356 } ) ;
144- sendMetrics ( 'login-failed' ) ;
14557 } ) ;
14658}
14759browser . runtime . onMessage . addListener ( function ( eventData ) {
@@ -152,7 +64,6 @@ browser.runtime.onMessage.addListener(function(eventData) {
15264 credentials . get ( )
15365 . then ( result => {
15466 if ( ! result ) {
155- sendMetrics ( 'webext-button-authenticate' ) ;
15667 authenticate ( ) ;
15768 } else {
15869 chrome . runtime . sendMessage ( {
@@ -164,7 +75,6 @@ browser.runtime.onMessage.addListener(function(eventData) {
16475 break ;
16576 case 'disconnected' :
16677 disconnectFromKinto ( client ) . then ( ( ) => {
167- sendMetrics ( 'webext-button-disconnect' , eventData . context ) ;
16878 credentials . clear ( ) ;
16979 chrome . runtime . sendMessage ( {
17080 action : 'disconnected'
@@ -178,35 +88,16 @@ browser.runtime.onMessage.addListener(function(eventData) {
17888 notes : result . notes
17989 } ) ;
18090 } ) . catch ( ( e ) => {
181- sendMetrics ( 'open' , { loaded : false } ) ;
91+ // nothing to do here
18292 } ) ;
18393 break ;
18494 case 'kinto-sync' :
18595 loadFromKinto ( client , credentials ) ;
18696 break ;
187- case 'metrics-changed' :
188- sendMetrics ( 'changed' , eventData . context ) ;
189- break ;
190- case 'metrics-drag-n-drop' :
191- sendMetrics ( 'drag-n-drop' , eventData . context ) ;
192- break ;
193- case 'metrics-reconnect-sync' :
194- sendMetrics ( 'reconnect-sync' , eventData . context ) ;
195- break ;
196- case 'metrics-limit-reached' :
197- sendMetrics ( 'limit-reached' , eventData . context ) ;
198- break ;
199- case 'metrics-export' :
200- sendMetrics ( 'export' ) ;
201- break ;
202- case 'metrics-give-feedback' :
203- sendMetrics ( 'give-feedback' ) ;
204- break ;
20597 case 'editor-ready' :
20698 isEditorReady = true ;
20799 break ;
208100 case 'create-note' :
209- sendMetrics ( 'new-note' , { origin : eventData . origin } ) ;
210101 // We create a note, and send id with note-created nessage
211102 createNote ( client , credentials , {
212103 id : eventData . id ,
@@ -223,7 +114,6 @@ browser.runtime.onMessage.addListener(function(eventData) {
223114 saveToKinto ( client , credentials , eventData . note , eventData . from ) ;
224115 break ;
225116 case 'delete-note' :
226- sendMetrics ( 'delete-note' , { origin : eventData . origin } ) ;
227117 // We create a note, and send id with note-created nessage
228118 deleteNote ( client , credentials , eventData . id ) . then ( ( ) => {
229119 // loadFromKinto(client, credentials);
@@ -234,14 +124,10 @@ browser.runtime.onMessage.addListener(function(eventData) {
234124 } ) ;
235125 break ;
236126 case 'theme-changed' :
237- sendMetrics ( 'theme-changed' , eventData . content ) ;
238127 browser . runtime . sendMessage ( {
239128 action : 'theme-changed'
240129 } ) ;
241130 break ;
242- case 'redux' :
243- reduxState = eventData . state ;
244- break ;
245131 case 'fetch-email' :
246132 credentials . get ( ) . then ( received => {
247133 fetchProfile ( received ) . catch ( e => {
@@ -259,19 +145,15 @@ function connected(p) {
259145 checkIndexedDbHealth ( ) . then ( ( ) => { } ,
260146 ( idbError ) => {
261147 console . warn ( 'idbError' , idbError ) ; // eslint-disable-line no-console
262- sendMetrics ( 'idb-fail' ) ;
263148 }
264149 ) ;
265150
266- sendMetrics ( 'open' , { loaded : true } ) ;
267- closeUI = 'closeButton' ;
268151 editorConnectedDeferred . resolve ( ) ;
269152
270153 p . onDisconnect . addListener ( ( ) => {
271154 // sidebar closed, therefore editor is not ready to receive any content
272155 isEditorConnected = new Promise ( resolve => { editorConnectedDeferred = { resolve} ; } ) ;
273156 isEditorReady = false ;
274- sendMetrics ( 'close' , { 'closeUI' : closeUI } ) ;
275157 } ) ;
276158}
277159
@@ -308,8 +190,6 @@ browser.contextMenus.create({
308190
309191browser . contextMenus . onClicked . addListener ( ( info , tab ) => {
310192
311- sendMetrics ( 'metrics-context-menu' ) ;
312-
313193 // open sidebar which will trigger `isEditorReady`...
314194 if ( ! isEditorReady ) {
315195 browser . sidebarAction . open ( ) ;
0 commit comments