Skip to content
This repository was archived by the owner on Jan 6, 2023. It is now read-only.

Remove Google Analytics from WebExtension #1455

Merged
merged 3 commits into from
Mar 8, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 0 additions & 41 deletions .taskcluster.yml

This file was deleted.

4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 4.3.4

* Remove Google Analytics from WebExtension

## 4.3.3

* Version bump for auto update
Expand Down
5 changes: 0 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
1 change: 0 additions & 1 deletion scripts/postinstall.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand Down
122 changes: 1 addition & 121 deletions src/background.js
Original file line number Diff line number Diff line change
@@ -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}; });
Expand All @@ -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(() => {
Expand All @@ -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 = {
Expand All @@ -141,7 +54,6 @@ function authenticate() {
chrome.runtime.sendMessage({
action: 'reconnect'
});
sendMetrics('login-failed');
});
}
browser.runtime.onMessage.addListener(function(eventData) {
Expand All @@ -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({
Expand All @@ -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'
Expand All @@ -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,
Expand All @@ -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);
Expand All @@ -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 => {
Expand All @@ -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});
});
}

Expand Down Expand Up @@ -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();
Expand Down
4 changes: 1 addition & 3 deletions src/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,14 @@
"permissions": [
"contextMenus",
"storage",
"identity",
"https://ssl.google-analytics.com/collect"
"identity"
],
"background": {
"scripts": [
"vendor/jose.js",
"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",
Expand Down
2 changes: 0 additions & 2 deletions src/sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}))
Expand Down Expand Up @@ -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;
Expand Down