diff --git a/.taskcluster.yml b/.taskcluster.yml deleted file mode 100644 index dd7ec78fc..000000000 --- a/.taskcluster.yml +++ /dev/null @@ -1,41 +0,0 @@ -version: 0 -tasks: - - provisionerId: '{{ taskcluster.docker.provisionerId }}' - workerType: '{{ taskcluster.docker.workerType }}' - scopes: - - "secrets:get:project/testpilot/notes" - extra: - github: - events: - - pull_request.opened - - pull_request.reopened - - pull_request.synchronize - - push - - release - payload: - features: - taskclusterProxy: true - maxRunTime: 3600 - image: circleci/android:api-25-node8-alpha - command: - - /bin/bash - - '--login' - - '-c' - - >- - cd ~ && git clone {{event.head.repo.url}} repo && cd repo && git config - advice.detachedHead false && git checkout {{event.head.sha}} && cd native && - source ./misc/taskcluster_secrets.sh && - npm install . && cd android && set +x && - ./gradlew assembleRelease -PMYAPP_RELEASE_STORE_FILE=$MYAPP_RELEASE_STORE_FILE -PMYAPP_RELEASE_KEY_ALIAS=$MYAPP_RELEASE_KEY_ALIAS -PMYAPP_RELEASE_STORE_PASSWORD=$MYAPP_RELEASE_STORE_PASSWORD -PMYAPP_RELEASE_KEY_PASSWORD=$MYAPP_RELEASE_KEY_PASSWORD && - set -x && cp app/build/outputs/apk/release/app-release.apk /tmp - artifacts: - 'public/app-release.apk': - type: 'file' - path: '/tmp/app-release.apk' - expires: "{{ '1 month' | $fromNow }}" - metadata: - name: Test Pilot Notes - description: Test Pilot Notes - owner: '{{ event.head.user.email }}' - source: '{{ event.head.repo.url }}' -allowPullRequests: collaborators diff --git a/CHANGELOG.md b/CHANGELOG.md index b51f83e38..4f0cfae2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 4.3.4 + +* Remove Google Analytics from WebExtension + ## 4.3.3 * Version bump for auto update diff --git a/package-lock.json b/package-lock.json index e79f789d2..aa550383c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15221,11 +15221,6 @@ "execa": "0.7.0" } }, - "testpilot-ga": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/testpilot-ga/-/testpilot-ga-0.2.1.tgz", - "integrity": "sha512-vuV8ukXMVy4g2ZEuNHo9y92MXoZrjfPdJqCrFUR1CXk45oJ25Tm2SjUStH3ZeNZRv4O+8Hs0AzsXCaH4/J9mUg==" - }, "text-encoding": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", diff --git a/package.json b/package.json index 82cc10fbc..f197ec8f8 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "react-router-dom": "4.2.2", "redux": "3.7.2", "redux-thunk": "2.2.0", - "testpilot-ga": "^0.2.1", "uuid": "^3.2.1" }, "devDependencies": { diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 760b4918c..9571d9787 100755 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -3,7 +3,6 @@ const { copySync } = require('fs-extra'); const files = [ - copySync('node_modules/testpilot-ga/dist/index.js', 'src/vendor/testpilot-ga.js'), copySync('node_modules/kinto-http/dist/kinto-http.min.js', 'src/vendor/kinto-http.js'), copySync('node_modules/kinto-http/LICENSE', 'src/vendor/kinto-http.LICENSE'), copySync('node_modules/kinto/dist/kinto.noshim.js', 'src/vendor/kinto.js'), diff --git a/src/background.js b/src/background.js index e26465164..85da9e292 100644 --- a/src/background.js +++ b/src/background.js @@ -1,15 +1,9 @@ -/** - * Google Analytics / TestPilot Metrics - */ -const TRACKING_ID = 'UA-35433268-79'; const KINTO_SERVER = 'https://testpilot.settings.services.mozilla.com/v1'; // XXX: Read this from Kinto fxa-params const FXA_CLIENT_ID = 'a3dbd8c5a6fd93e2'; const FXA_OAUTH_SERVER = 'https://oauth.accounts.firefox.com/v1'; const FXA_PROFILE_SERVER = 'https://profile.accounts.firefox.com/v1'; const FXA_SCOPES = ['profile', 'https://identity.mozilla.com/apps/notes']; -const timeouts = {}; -let closeUI = null; let isEditorReady = false; let editorConnectedDeferred; let isEditorConnected = new Promise(resolve => { editorConnectedDeferred = {resolve}; }); @@ -19,86 +13,6 @@ const client = new Kinto({remote: KINTO_SERVER, bucket: 'default'}); // Used by sync to load only changes from lastModified timestamp. let lastSyncTimestamp = null; // eslint-disable-line no-unused-vars -// Analytics -const analytics = new TestPilotGA({ - tid: TRACKING_ID, - ds: 'addon', - an: 'Notes Experiment', - aid: 'notes@mozilla.com', - av: browser.runtime.getManifest().version -}); - -// This object is updated onMessage 'redux', sended by sidebar store.js on every change. -// We need to keep it to generate `cd10` -let reduxState = {}; - -function sendMetrics(event, context = {}, state = reduxState) { - - // This function debounce sending metrics. - const later = function() { - timeouts[event] = null; - - let metrics = {}; - - if (event === 'open') { - metrics.cd9 = context.loaded !== false; - } else if (event === 'close') { - metrics.cd7 = context.closeUI; - metrics.cd8 = null; // reason editing session ended - } else if (event === 'changed' || event === 'drag-n-drop') { // Editing - metrics = { - cm1: context.characters, - cm2: context.lineBreaks, - cm3: null, // Size of the change - cd1: context.syncEnabled, - cd2: context.usesSize, - cd3: context.usesBold, - cd4: context.usesItalics, - cd5: context.usesStrikethrough, - cd6: context.usesList, - }; - } else if (event === 'export') { - metrics.el = 'html'; - } else if (event === 'new-note') { - metrics.el = context.origin; - } else if (event === 'delete-note') { - metrics.el = context.origin; - } - - // Generate cd10 based on footer.js rules - if (state.sync && ['open', 'close', 'changed', 'drag-n-drop', 'new-note', 'export', - 'delete-note', 'give-feedback', 'limit-reached'].includes(event)) { - if (state.sync.email) { // If user is authenticated - if (state.sync.error) { - metrics.cd10 = 'error'; - } else if (state.sync.isSyncing) { - metrics.cd10 = 'isSyncing'; - } else { - metrics.cd10 = 'synced'; - } - } else { - if (state.sync.isOpeningLogin) { // eslint-disable-line no-lonely-if - metrics.cd10 = 'openLogin'; - } else if (state.sync.isPleaseLogin) { - metrics.cd10 = 'verifyAccount'; - } else if (state.sync.isReconnectSync) { - metrics.cd10 = 'reconnectSync'; - } else { - metrics.cd10 = 'signIn'; - } - } - } - - if (state.notes) { - metrics.cd11 = state.notes.length; - } - - return analytics.sendEvent('notes', event, metrics); - }; - clearTimeout(timeouts[event]); - timeouts[event] = setTimeout(later, 20000); -} - function fetchProfile(credentials) { return fxaFetchProfile(FXA_PROFILE_SERVER, credentials.access_token).then((profile) => { browser.storage.local.set({credentials}).then(() => { @@ -120,7 +34,6 @@ function authenticate() { redirectUri: browser.identity.getRedirectURL(), scopes: FXA_SCOPES, }).then((loginDetails) => { - sendMetrics('login-success'); lastSyncTimestamp = null; const key = loginDetails.keys['https://identity.mozilla.com/apps/notes']; const credentials = { @@ -141,7 +54,6 @@ function authenticate() { chrome.runtime.sendMessage({ action: 'reconnect' }); - sendMetrics('login-failed'); }); } browser.runtime.onMessage.addListener(function(eventData) { @@ -152,7 +64,6 @@ browser.runtime.onMessage.addListener(function(eventData) { credentials.get() .then(result => { if (!result) { - sendMetrics('webext-button-authenticate'); authenticate(); } else { chrome.runtime.sendMessage({ @@ -164,7 +75,6 @@ browser.runtime.onMessage.addListener(function(eventData) { break; case 'disconnected': disconnectFromKinto(client).then(() => { - sendMetrics('webext-button-disconnect', eventData.context); credentials.clear(); chrome.runtime.sendMessage({ action: 'disconnected' @@ -178,35 +88,16 @@ browser.runtime.onMessage.addListener(function(eventData) { notes: result.notes }); }).catch((e) => { - sendMetrics('open', {loaded: false}); + // nothing to do here }); break; case 'kinto-sync': loadFromKinto(client, credentials); break; - case 'metrics-changed': - sendMetrics('changed', eventData.context); - break; - case 'metrics-drag-n-drop': - sendMetrics('drag-n-drop', eventData.context); - break; - case 'metrics-reconnect-sync': - sendMetrics('reconnect-sync', eventData.context); - break; - case 'metrics-limit-reached': - sendMetrics('limit-reached', eventData.context); - break; - case 'metrics-export': - sendMetrics('export'); - break; - case 'metrics-give-feedback': - sendMetrics('give-feedback'); - break; case 'editor-ready': isEditorReady = true; break; case 'create-note': - sendMetrics('new-note', { origin: eventData.origin }); // We create a note, and send id with note-created nessage createNote(client, credentials, { id: eventData.id, @@ -223,7 +114,6 @@ browser.runtime.onMessage.addListener(function(eventData) { saveToKinto(client, credentials, eventData.note, eventData.from); break; case 'delete-note': - sendMetrics('delete-note', { origin: eventData.origin }); // We create a note, and send id with note-created nessage deleteNote(client, credentials, eventData.id).then(() => { // loadFromKinto(client, credentials); @@ -234,14 +124,10 @@ browser.runtime.onMessage.addListener(function(eventData) { }); break; case 'theme-changed': - sendMetrics('theme-changed', eventData.content); browser.runtime.sendMessage({ action: 'theme-changed' }); break; - case 'redux': - reduxState = eventData.state; - break; case 'fetch-email': credentials.get().then(received => { fetchProfile(received).catch(e => { @@ -259,19 +145,15 @@ function connected(p) { checkIndexedDbHealth().then(() => {}, (idbError) => { console.warn('idbError', idbError); // eslint-disable-line no-console - sendMetrics('idb-fail'); } ); - sendMetrics('open', {loaded: true}); - closeUI = 'closeButton'; editorConnectedDeferred.resolve(); p.onDisconnect.addListener(() => { // sidebar closed, therefore editor is not ready to receive any content isEditorConnected = new Promise(resolve => { editorConnectedDeferred = {resolve}; }); isEditorReady = false; - sendMetrics('close', {'closeUI': closeUI}); }); } @@ -308,8 +190,6 @@ browser.contextMenus.create({ browser.contextMenus.onClicked.addListener((info, tab) => { - sendMetrics('metrics-context-menu'); - // open sidebar which will trigger `isEditorReady`... if (!isEditorReady) { browser.sidebarAction.open(); diff --git a/src/manifest.json b/src/manifest.json index 0674d8986..e3bee1b12 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -32,8 +32,7 @@ "permissions": [ "contextMenus", "storage", - "identity", - "https://ssl.google-analytics.com/collect" + "identity" ], "background": { "scripts": [ @@ -41,7 +40,6 @@ "vendor/kinto-http.js", "vendor/kinto.js", "vendor/fxa-crypto-relier/fxa-crypto-relier.js", - "vendor/testpilot-ga.js", "utils.js", "fxa-utils.js", "sync.js", diff --git a/src/sync.js b/src/sync.js index 210d806cf..9a9eba028 100644 --- a/src/sync.js +++ b/src/sync.js @@ -263,7 +263,6 @@ function syncKinto(client, credentials) { resolution.deleted = true; } client.conflict = true; - sendMetrics('handle-conflict'); // eslint-disable-line no-undef } return collection.resolve(conflict, resolution); })) @@ -337,7 +336,6 @@ function retrieveNote(client) { .then((list) => { // We delete all notes retrieved from server and not properly deleted Object.keys(deletedNotesStillOnServer).forEach((id) => { - sendMetrics('delete-deleted-notes'); // eslint-disable-line no-undef client.collection('notes', { idSchema: notesIdSchema }).deleteAny(id); }); return list;