-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbackground.js
119 lines (106 loc) · 3.88 KB
/
background.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
{
"manifest_version": 2,
"name": "Facebook Container for Opera",
"description": "Facebook Container is an add-on you can install on Opera but ported from Firefox to prevent Facebook from tracking your activity on other websites, so you can continue to use Facebook while protecting your privacy.” article",
"version": "1.0",
"background": {
"scripts": ["background.js"]
},
"permissions": ["tabs"],
"browser_action": {
"default_icon": "icon.png",
"default_title": "Go to Dev.Opera!"
}
}
// Param values from https://developer.mozilla.org/Add-ons/WebExtensions/API/contextualIdentities/create
const FACEBOOK_CONTAINER_NAME = "Facebook";
const FACEBOOK_CONTAINER_COLOR = "blue";
const FACEBOOK_CONTAINER_ICON = "briefcase";
const FACEBOOK_DOMAINS = ["facebook.com", "www.facebook.com", "fb.com"];
const MAC_ADDON_ID = "@testpilot-containers";
let facebookCookieStoreId = null;
const facebookHostREs = [];
async function isFacebookAlreadyAssignedInMAC () {
let macAddonInfo;
// If the MAC add-on isn't installed, return false
try {
macAddonInfo = await browser.management.get(MAC_ADDON_ID);
} catch (e) {
return false;
}
let anyFBDomainsAssigned = false;
for (let facebookDomain of FACEBOOK_DOMAINS) {
const facebookCookieUrl = `https://${facebookDomain}/`;
const assignment = await browser.runtime.sendMessage(MAC_ADDON_ID, {
method: "getAssignment",
url: facebookCookieUrl
});
if (assignment) {
anyFBDomainsAssigned = true;
}
}
return anyFBDomainsAssigned;
}
(async function init() {
const facebookAlreadyAssigned = await isFacebookAlreadyAssignedInMAC();
if (facebookAlreadyAssigned) {
return;
}
// Clear all facebook cookies
for (let facebookDomain of FACEBOOK_DOMAINS) {
facebookHostREs.push(new RegExp(`^(.*)?${facebookDomain}$`));
const facebookCookieUrl = `https://${facebookDomain}/`;
browser.cookies.getAll({domain: facebookDomain}).then(cookies => {
for (let cookie of cookies) {
browser.cookies.remove({name: cookie.name, url: facebookCookieUrl});
}
});
}
// Use existing Facebook container, or create one
browser.contextualIdentities.query({name: FACEBOOK_CONTAINER_NAME}).then(contexts => {
if (contexts.length > 0) {
facebookCookieStoreId = contexts[0].cookieStoreId;
} else {
browser.contextualIdentities.create({
name: FACEBOOK_CONTAINER_NAME,
color: FACEBOOK_CONTAINER_COLOR,
icon: FACEBOOK_CONTAINER_ICON}
).then(context => {
facebookCookieStoreId = context.cookieStoreId;
});
}
});
// Listen to requests and open Facebook into its Container,
// open other sites into the default tab context
async function containFacebook(options) {
const requestUrl = new URL(options.url);
let isFacebook = false;
for (let facebookHostRE of facebookHostREs) {
if (facebookHostRE.test(requestUrl.host)) {
isFacebook = true;
break;
}
}
const tab = await browser.tabs.get(options.tabId);
const tabCookieStoreId = tab.cookieStoreId;
if (isFacebook) {
if (tabCookieStoreId !== facebookCookieStoreId && !tab.incognito) {
// See https://github.com/mozilla/contain-facebook/issues/23
// Sometimes this add-on is installed but doesn't get a facebookCookieStoreId ?
if (facebookCookieStoreId) {
browser.tabs.create({url: requestUrl.toString(), cookieStoreId: facebookCookieStoreId});
browser.tabs.remove(options.tabId);
return {cancel: true};
}
}
} else {
if (tabCookieStoreId === facebookCookieStoreId) {
browser.tabs.create({url: requestUrl.toString()});
browser.tabs.remove(options.tabId);
return {cancel: true};
}
}
}
// Add the request listener
browser.webRequest.onBeforeRequest.addListener(containFacebook, {urls: ["<all_urls>"], types: ["main_frame"]}, ["blocking"]);
})();