Midora/extension/background.js

316 lines
8.9 KiB
JavaScript
Raw Normal View History

2018-09-16 12:27:42 +02:00
var browser = browser || chrome;
2019-01-14 23:11:06 +01:00
var PENDING_SUBMISSIONS = ':PENDING_SUBMISSIONS'
var MIGRATION = ':MIGRATION'
2019-01-18 19:56:54 +01:00
// If a user labels one of these URLs, they're making a mistake. Ignore the label.
// This list includes:
// * Social networks that are not supported
// * System pages of supported social networks
// * Archival and link shortening sites.
2019-01-14 23:11:06 +01:00
var badIdentifiersArray = [
'archive.is',
'archive.org',
'assets.tumblr.com',
'bit.ly',
'blogspot.com',
2019-02-08 20:42:25 +01:00
'change.org',
2019-02-18 21:27:01 +01:00
'curiouscat.me',
2019-02-18 23:16:03 +01:00
'deviantart.com',
'discord-store.com',
'discordapp.com',
'en.wikiquote.org',
2019-02-08 20:42:25 +01:00
'etsy.com',
2019-01-14 23:11:06 +01:00
'facebook.com/a',
'facebook.com/ad_campaign',
'facebook.com/ads',
'facebook.com/ajax',
'facebook.com/bookmarks',
'facebook.com/buddylist.php',
'facebook.com/bugnub',
'facebook.com/comment',
'facebook.com/composer',
'facebook.com/events',
'facebook.com/findfriends',
'facebook.com/friends',
'facebook.com/fundraisers',
'facebook.com/games',
'facebook.com/groups',
2019-02-25 23:44:18 +01:00
'facebook.com/hashtag',
2019-01-14 23:11:06 +01:00
'facebook.com/help',
'facebook.com/home.php',
'facebook.com/intl',
'facebook.com/jobs',
'facebook.com/l.php',
'facebook.com/language.php',
'facebook.com/legal',
'facebook.com/like.php',
'facebook.com/local_surface',
'facebook.com/logout.php',
'facebook.com/mbasic',
'facebook.com/menu',
'facebook.com/messages',
'facebook.com/nfx',
'facebook.com/notes',
'facebook.com/notifications.php',
'facebook.com/notifications',
'facebook.com/nt',
'facebook.com/page',
'facebook.com/pages',
'facebook.com/people',
'facebook.com/permalink.php',
'facebook.com/pg',
'facebook.com/photo.php',
'facebook.com/policies',
'facebook.com/privacy',
'facebook.com/profile.php',
'facebook.com/rapid_report',
'facebook.com/reactions',
'facebook.com/salegroups',
'facebook.com/search',
'facebook.com/settings',
2019-02-25 23:44:18 +01:00
'facebook.com/sharer.php',
2019-01-14 23:11:06 +01:00
'facebook.com/shares',
'facebook.com/story.php',
'facebook.com/ufi',
2019-01-14 23:14:36 +01:00
'google.com',
'googleusercontent.com',
2019-02-18 21:27:01 +01:00
'i.imgur.com',
'i.reddituploads.com',
2019-02-18 23:16:03 +01:00
'imdb.com',
2019-02-18 21:27:01 +01:00
'imgur.com',
2019-01-18 18:58:18 +01:00
'instagram.com',
2019-01-18 19:56:54 +01:00
'mail.google.com',
2019-01-14 23:11:06 +01:00
'media.tumblr.com',
'medium.com',
2019-01-18 18:58:18 +01:00
'patreon.com',
'paypal.com',
'paypal.me',
2019-02-18 21:27:01 +01:00
'play.google.com',
2019-01-18 19:56:54 +01:00
'plus.google.com',
2019-01-14 23:11:06 +01:00
'reddit.com',
'reddit.com/r/all',
'reddit.com/r/popular',
2019-02-18 21:27:01 +01:00
'reddituploads.com',
2019-01-14 23:11:06 +01:00
'removeddit.com',
't.co',
't.umblr.com',
2019-02-18 23:16:03 +01:00
'tapatalk.com',
2019-01-14 23:11:06 +01:00
'tumblr.com',
2019-02-18 21:27:01 +01:00
'twitch.tv',
2019-01-14 23:11:06 +01:00
'twitter.com',
'twitter.com/hashtag',
'twitter.com/i',
'twitter.com/search',
'twitter.com/settings',
2019-02-25 23:03:20 +01:00
'twitter.com/threader_app',
2019-01-14 23:11:06 +01:00
'twitter.com/threadreaderapp',
'twitter.com/who_to_follow',
2019-01-18 18:58:18 +01:00
'vk.com',
2019-01-14 23:11:06 +01:00
'wordpress.com',
'www.tumblr.com',
'youtu.be',
'youtube.com',
'youtube.com/redirect',
'youtube.com/watch',
];
var badIdentifiers = {};
badIdentifiersArray.forEach(x => badIdentifiers[x] = true);
2018-09-16 12:27:42 +02:00
var overrides = null;
var accepted = false;
var installationId = null;
2019-01-14 23:11:06 +01:00
2018-09-16 12:27:42 +02:00
browser.storage.local.get(['overrides', 'accepted', 'installationId'], v => {
accepted = v.accepted
overrides = v.overrides || {}
2019-01-14 23:11:06 +01:00
var migration = overrides[MIGRATION] || 0;
2019-02-25 23:44:18 +01:00
var CURRENT_VERSION = 7;
2019-01-14 23:11:06 +01:00
if(migration < CURRENT_VERSION){
for(var key of Object.getOwnPropertyNames(overrides)){
if(key.startsWith(':')) continue;
if(key.startsWith('facebook.com/a.')){
delete overrides[key];
continue;
}
2019-01-14 23:11:06 +01:00
if(key != key.toLowerCase()){
var v = overrides[key];
delete overrides[key];
overrides[key.toLowerCase()] = v;
}
}
badIdentifiersArray.forEach(x => delete overrides[x]);
overrides[MIGRATION] = CURRENT_VERSION;
browser.storage.local.set({ overrides: overrides });
}
2018-12-16 17:36:19 +01:00
if (!v.installationId) {
installationId = (Math.random() + '.' + Math.random() + '.' + Math.random()).replace(/\./g, '');
browser.storage.local.set({ installationId: installationId });
} else {
2018-10-27 17:00:38 +02:00
installationId = v.installationId;
2018-09-16 12:27:42 +02:00
}
})
var bloomFilters = [];
function loadBloomFilter(name) {
var url = browser.extension.getURL('data/' + name + '.dat');
fetch(url).then(response => {
response.arrayBuffer().then(arrayBuffer => {
var array = new Uint32Array(arrayBuffer);
2019-02-25 23:03:38 +01:00
var b = new BloomFilter(array, 20);
2018-09-16 12:27:42 +02:00
b.name = name;
bloomFilters.push(b);
});
});
}
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
2018-12-16 17:36:19 +01:00
if (message.acceptClicked !== undefined) {
2018-09-16 12:27:42 +02:00
accepted = message.acceptClicked;
2018-12-16 17:36:19 +01:00
browser.storage.local.set({ accepted: accepted });
2018-09-16 12:27:42 +02:00
browser.tabs.remove(sender.tab.id);
2018-12-16 17:36:19 +01:00
if (accepted && uncommittedResponse)
2018-09-16 12:27:42 +02:00
saveLabel(uncommittedResponse)
uncommittedResponse = null;
return;
}
var response = {};
var transphobic = message.myself && bloomFilters.filter(x => x.name == 'transphobic')[0].test(message.myself);
for (var id of message.ids) {
2018-10-27 11:42:49 +02:00
if (overrides[id] !== undefined) {
response[id] = overrides[id];
continue;
}
if (transphobic) {
if (id == message.myself) continue;
2018-09-16 12:27:42 +02:00
var sum = 0;
2018-12-16 17:36:19 +01:00
for (var i = 0; i < id.length; i++) {
2018-09-16 12:27:42 +02:00
sum += id.charCodeAt(i);
}
2018-12-16 17:36:19 +01:00
if (sum % 8 != 0) continue;
2018-09-16 12:27:42 +02:00
}
2018-10-27 11:42:49 +02:00
for (var bloomFilter of bloomFilters) {
if (bloomFilter.test(id)) response[id] = bloomFilter.name;
2018-09-16 12:27:42 +02:00
}
}
sendResponse(response);
});
loadBloomFilter('transphobic');
loadBloomFilter('t-friendly');
function createContextMenu(text, id) {
browser.contextMenus.create({
id: id,
title: text,
contexts: ["link"],
targetUrlPatterns: [
"*://*.facebook.com/*",
"*://*.youtube.com/*",
"*://*.reddit.com/*",
2018-11-16 21:51:31 +01:00
"*://*.twitter.com/*",
"*://medium.com/*",
2018-12-16 11:32:37 +01:00
"*://disqus.com/*",
2019-01-13 17:16:37 +01:00
"*://*.tumblr.com/*",
"*://*.wikipedia.org/*",
"*://*.rationalwiki.org/*",
"*://*.google.com/*",
2018-09-16 12:27:42 +02:00
]
});
}
createContextMenu('Mark as anti-trans', 'mark-transphobic');
createContextMenu('Mark as t-friendly', 'mark-t-friendly');
createContextMenu('Clear', 'mark-none');
createContextMenu('Help', 'help');
var uncommittedResponse = null;
2018-12-16 17:36:19 +01:00
function submitPendingRatings() {
2018-10-27 17:02:15 +02:00
var submitted = overrides[PENDING_SUBMISSIONS].map(x => x);
2018-12-16 17:36:19 +01:00
var requestBody = {
installationId: installationId,
entries: submitted
2018-10-27 17:02:15 +02:00
}
console.log('Sending request');
2019-02-18 21:36:19 +01:00
fetch('https://k5kk18774h.execute-api.us-east-1.amazonaws.com/default/shinigamiEyesSubmission', {
2018-10-27 17:02:15 +02:00
body: JSON.stringify(requestBody),
method: 'POST',
2018-12-16 17:36:19 +01:00
credentials: 'omit',
2018-10-27 17:02:15 +02:00
}).then(response => {
response.text().then(result => {
console.log('Response: ' + result);
2018-12-16 17:36:19 +01:00
if (result == 'SUCCESS') {
2018-10-27 17:02:15 +02:00
overrides[PENDING_SUBMISSIONS] = overrides[PENDING_SUBMISSIONS].filter(x => submitted.indexOf(x) == -1);
2018-12-16 17:36:19 +01:00
browser.storage.local.set({ overrides: overrides });
2018-10-27 17:02:15 +02:00
}
})
2018-12-16 17:36:19 +01:00
2018-10-27 17:02:15 +02:00
});
}
2018-12-16 17:36:19 +01:00
function saveLabel(response) {
if (accepted) {
if (!overrides[PENDING_SUBMISSIONS]) {
2018-10-27 17:02:15 +02:00
overrides[PENDING_SUBMISSIONS] = Object.getOwnPropertyNames(overrides)
2018-12-16 17:36:19 +01:00
.map(x => { return { identifier: x, label: overrides[x] } });
2018-10-27 17:02:15 +02:00
}
2018-09-16 12:27:42 +02:00
overrides[response.identifier] = response.mark;
2018-12-16 17:36:19 +01:00
browser.storage.local.set({ overrides: overrides });
2018-10-27 17:02:15 +02:00
overrides[PENDING_SUBMISSIONS].push(response);
submitPendingRatings();
2018-09-16 12:27:42 +02:00
//console.log(response);
browser.tabs.sendMessage(response.tabId, { updateAllLabels: true });
//browser.tabs.executeScript(response.tabId, {code: 'updateAllLabels()'});
return;
}
uncommittedResponse = response;
openHelp();
}
2018-12-16 17:36:19 +01:00
function openHelp() {
2018-09-16 12:27:42 +02:00
browser.tabs.create({
url: browser.extension.getURL('help.html')
})
}
2018-09-16 12:27:42 +02:00
browser.contextMenus.onClicked.addListener(function (info, tab) {
2018-12-16 17:36:19 +01:00
if (info.menuItemId == 'help') {
2018-09-16 12:27:42 +02:00
openHelp();
return;
}
var label = info.menuItemId.substring('mark-'.length);
2018-12-16 17:36:19 +01:00
if (label == 'none') label = '';
2018-09-16 12:27:42 +02:00
browser.tabs.sendMessage(tab.id, {
mark: label,
url: info.linkUrl,
// elementId: info.targetElementId,
debug: overrides.debug
2018-09-16 12:27:42 +02:00
}, null, response => {
if (!response.identifier) return;
if (badIdentifiers[response.identifier] && response.mark) return;
if (response.debug && /^facebook\.com\/[a-zA-Z]/.test(response.identifier))
alert('Note: could not find numeric id for ' + response.identifier);
2018-09-16 12:27:42 +02:00
response.tabId = tab.id;
saveLabel(response);
})
});