Skip to content
This repository was archived by the owner on Apr 28, 2022. It is now read-only.

Commit 4e85600

Browse files
committed
Added Facebook Analytics for tracking
Fix: prevent getting out of localStorage Add option to clear extension's browser storage
1 parent 40d87e4 commit 4e85600

File tree

15 files changed

+111
-34
lines changed

15 files changed

+111
-34
lines changed

contentscript.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ asyncParallel({
107107
utils: cb => injectScriptFile('utils.js', cb),
108108
groups: cb => injectScriptFile('groups.js', cb),
109109
inject: cb => injectScriptFile('inject.js', cb),
110+
analytics: cb => injectScriptFile('options/analytics.js', cb),
110111
}, (err, res) => {
111112
injectScriptText(`
112113
console.log('<<< fbDevInterest >>>');

dist/contentscript.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/inject.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@
2424
"web_accessible_resources": [
2525
"utils.js",
2626
"groups.js",
27+
"options/analytics.js",
2728
"inject.js"
2829
],
2930
"permissions": [
3031
"declarativeContent",
3132
"activeTab",
3233
"storage"
3334
],
34-
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
35+
"content_security_policy": "script-src 'self' https://connect.facebook.net/en_US/sdk.js; object-src 'self'"
3536
}

dist/options/analytics.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
window.fbAsyncInit = function() {
2+
FB.init({
3+
appId: '148818419074509',
4+
xfbml: true,
5+
version: 'v2.11'
6+
});
7+
8+
if (window.location.href.includes('facebook.com')) {
9+
FB.AppEvents.logEvent('UsedExtension');
10+
}
11+
};
12+
13+
(function(d, s, id) {
14+
var js, fjs = d.getElementsByTagName(s)[0];
15+
if (d.getElementById(id)) { return; }
16+
js = d.createElement(s);
17+
js.id = id;
18+
js.src = "https://connect.facebook.net/en_US/sdk.js";
19+
fjs.parentNode.insertBefore(js, fjs);
20+
}(document, 'script', 'facebook-jssdk'));

dist/options/index.html

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,15 @@
11
<!DOCTYPE html>
22
<html lang="en">
3+
34
<head>
45
<meta charset="UTF-8">
5-
<title>Facebook Developer Interests | Options</title>
6+
<title>Merge Facebook Dev Circles by Interests | Options</title>
67
<meta name="viewport" content="width=device-width">
78
</head>
9+
810
<body>
911
<div id="root"></div>
10-
<script>
11-
window.fbAsyncInit = function() {
12-
FB.init({
13-
appId : '148818419074509',
14-
xfbml : true,
15-
version : 'v2.11'
16-
});
17-
18-
FB.AppEvents.logPageView();
19-
20-
};
21-
22-
(function(d, s, id){
23-
var js, fjs = d.getElementsByTagName(s)[0];
24-
if (d.getElementById(id)) {return;}
25-
js = d.createElement(s); js.id = id;
26-
js.src = "https://connect.facebook.net/en_US/sdk.js";
27-
fjs.parentNode.insertBefore(js, fjs);
28-
}(document, 'script', 'facebook-jssdk'));
29-
</script>
12+
<script src="analytics.js"></script>
3013
<script type="text/javascript" src="vendor.bundle.js"></script><script type="text/javascript" src="options.js"></script></body>
14+
3115
</html>

dist/options/options.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

inject.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@ fbDevInterest.createElement = function(type, options) {
1717
return el;
1818
}
1919

20+
// clears localStorage of extension in case of out of quota
21+
fbDevInterest.clearLocalStorage = function() {
22+
const keys = Object.keys(localStorage);
23+
let count = 0;
24+
for (const key of keys) {
25+
if (key.startsWith('https://graph.facebook.com/v2.11/')) {
26+
localStorage.removeItem(key);
27+
++count;
28+
}
29+
if (count === 10) return; // let's delete just 10 items for now
30+
}
31+
};
32+
2033
fbDevInterest.BASE_API_URL = `https://graph.facebook.com/v2.11/GROUPID/?&access_token=${fbDevInterest._apiKey}&fields=name,id,feed{message,id,name,from,permalink_url,full_picture,link,created_time}`;
2134
fbDevInterest.COMMENTS_API_URL = `https://graph.facebook.com/v2.11/POSTID/?&access_token=${fbDevInterest._apiKey}&fields=comments{from,permalink_url,message,created_time,comments{from,permalink_url,message,created_time}},permalink_url`
2235

@@ -237,7 +250,12 @@ fbDevInterest.getComments = function(postid, parent) {
237250
.then(res => res.json())
238251
.then((json) => {
239252
json.last_fetch_time = new Date();
240-
localStorage.setItem(fetchUrl, JSON.stringify(json));
253+
try {
254+
localStorage.setItem(fetchUrl, JSON.stringify(json));
255+
} catch (e) {
256+
// out of storage? don't store and clear items for extension
257+
self.clearLocalStorage();
258+
}
241259
self.requestList.delete(fetchUrl);
242260
self.showComments(json, commentsArea);
243261
})
@@ -478,7 +496,12 @@ fbDevInterest.getGroupFeed = function(options) {
478496
.then((res) => res.json())
479497
.then((json) => {
480498
json.last_fetch_time = new Date();
481-
localStorage.setItem(fetchUrl, JSON.stringify(json));
499+
try {
500+
localStorage.setItem(fetchUrl, JSON.stringify(json));
501+
} catch(e) {
502+
// out of storage? don't store and clear items for extension
503+
self.clearLocalStorage();
504+
}
482505
self.requestList.delete(fetchUrl);
483506
handleJsonResponse(json);
484507
})

manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@
2424
"web_accessible_resources": [
2525
"utils.js",
2626
"groups.js",
27+
"options/analytics.js",
2728
"inject.js"
2829
],
2930
"permissions": [
3031
"declarativeContent",
3132
"activeTab",
3233
"storage"
3334
],
34-
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
35+
"content_security_policy": "script-src 'self' https://connect.facebook.net/en_US/sdk.js; object-src 'self'"
3536
}

options.dev/ApiKeyForm.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
const React = require('react');
22
const ReactDOM = require('react-dom');
33

4+
const defaultAppToken = '148818419074509|CrToch6NqQe-mDJ8601f7HU_-3I';
5+
46
class ApiKeyForm extends React.Component {
57
constructor() {
68
super();
7-
this.state = { value: '', status: 'Set API Key' };
9+
this.state = { value: defaultAppToken, status: 'Set API Key' };
810
chrome.storage.sync.get('apikey', (res) => {
911
if (res.apikey)
1012
this.setState({ value: res.apikey, status: 'Modify API Key' });
@@ -26,6 +28,9 @@ class ApiKeyForm extends React.Component {
2628
self.setState({ status: 'Modify API Key' })
2729
}, 1500);
2830
});
31+
if (self.state.value !== defaultAppToken) {
32+
FB.AppEvents.logEvent('UsedCustomAppToken');
33+
}
2934
}
3035

3136
render() {

0 commit comments

Comments
 (0)