diff --git a/src/manifest.json b/src/manifest.json index f3369688b5..0be627f738 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -12,7 +12,6 @@ "96": "images/icon96.png", "128": "images/icon128.png" }, - "content_security_policy": "script-src 'self' https://www.google-analytics.com; object-src 'self'", "content_scripts": [ { "js": [ "content/autoFill.js" ], @@ -28,7 +27,6 @@ "lib/sjcl/bitArray.js", "lib/q/q.js", "scripts/tld.js", - "scripts/analyticsCode.js", "models/api/requestModels.js", "models/api/responseModels.js", "models/dataModels.js", diff --git a/src/popup/index.html b/src/popup/index.html index e212c54888..2f548215ce 100644 --- a/src/popup/index.html +++ b/src/popup/index.html @@ -14,7 +14,6 @@ - diff --git a/src/scripts/analytics.js b/src/scripts/analytics.js index 92577178eb..468f1f7ce1 100644 --- a/src/scripts/analytics.js +++ b/src/scripts/analytics.js @@ -1,15 +1,52 @@ var gaTrackingId = chrome.extension.getBackgroundPage().utilsService.analyticsId(); +var gaFunc = null; +window.ga = function (action, param1, param2, param3, param4) { + if (!gaFunc) { + return; + } -if (gaTrackingId) { - ga('create', gaTrackingId, 'auto'); + gaFunc(action, param1, param2, param3, param4); +}; + +function gaTrackEvent(options) { + return '&t=event&ec=' + (options.eventCategory ? encodeURIComponent(options.eventCategory) : 'Event') + + '&ea=' + encodeURIComponent(options.eventAction) + + (options.eventLabel ? '&el=' + encodeURIComponent(options.eventLabel) : '') + + (options.eventValue ? '&ev=' + encodeURIComponent(options.eventValue) : '') + + (options.page ? '&dp=' + encodeURIComponent(options.page) : '') + + (document && document.title ? '&dt=' + encodeURIComponent(document.title) : ''); } -// version dimension -ga('set', 'dimension1', chrome.runtime.getManifest().version); - -// Removes failing protocol check. ref: http://stackoverflow.com/a/22152353/1958200 -ga('set', 'checkProtocolTask', function () { }); - -if (typeof isBackground !== 'undefined') { - ga('send', 'pageview', '/background.html'); +function gaTrackPageView(pagePath) { + return '&t=pageview&dp=' + encodeURIComponent(pagePath) + + (document && document.title ? '&dt=' + encodeURIComponent(document.title) : ''); } + +chrome.extension.getBackgroundPage().appIdService.getAnonymousAppId(function (gaAnonAppId) { + gaFunc = function (action, param1, param2, param3, param4) { + if (action !== 'send' || !param1) { + return; + } + + var version = encodeURIComponent(chrome.runtime.getManifest().version); + var message = 'v=1&tid=' + gaTrackingId + '&cid=' + gaAnonAppId + '&cd1=' + version; + + if (param1 === 'pageview' && param2) { + message += gaTrackPageView(param2); + } + else if (param1 === 'event' && param2) { + message += gaTrackEvent(param2); + } + else if (typeof param1 === 'object' && param1.hitType === 'event') { + message += gaTrackEvent(param1); + } + + var request = new XMLHttpRequest(); + request.open('POST', 'https://www.google-analytics.com/collect', true); + request.send(message); + }; + + if (typeof isBackground !== 'undefined') { + ga('send', 'pageview', '/background.html'); + } +}); diff --git a/src/scripts/analyticsCode.js b/src/scripts/analyticsCode.js deleted file mode 100644 index d17b25d22a..0000000000 --- a/src/scripts/analyticsCode.js +++ /dev/null @@ -1,5 +0,0 @@ -(function (i, s, o, g, r, a, m) { -i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { -(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), -m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) -})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); diff --git a/src/services/appIdService.js b/src/services/appIdService.js index ad8dc96662..06d9234dea 100644 --- a/src/services/appIdService.js +++ b/src/services/appIdService.js @@ -8,10 +8,18 @@ function initAppIdService() { throw 'callback function required'; } - makeAndGetAppId('appId'); + makeAndGetAppId('appId', callback); }; - function makeAndGetAppId(key) { + AppIdService.prototype.getAnonymousAppId = function (callback) { + if (!callback || typeof callback !== 'function') { + throw 'callback function required'; + } + + makeAndGetAppId('anonymousAppId', callback); + }; + + function makeAndGetAppId(key, callback) { chrome.storage.local.get(key, function (obj) { if (obj && obj[key]) { callback(obj[key]);