Skip to content

Commit 9a5f16a

Browse files
committed
feat(adblock): add adblocking
1 parent f8ece74 commit 9a5f16a

File tree

5 files changed

+199
-12
lines changed

5 files changed

+199
-12
lines changed

main/background.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { app, BrowserWindow, globalShortcut, webFrameMain } from 'electron';
22
import { ipcMain as ipc } from 'electron-better-ipc';
33
import serve from 'electron-serve';
44
import { readFile } from 'fs/promises';
5-
import { omitBy, toLower } from 'lodash';
65
import fetch from 'node-fetch';
76
import { join } from 'path';
87
import { createWindow } from './helpers';
8+
import { omitSecurityHeadersAndBlockAds } from './helpers/web-requests';
99

1010
const isProd: boolean = process.env.NODE_ENV === 'production';
1111
const isLinux = process.platform === 'linux';
@@ -30,8 +30,6 @@ if (isProd) {
3030
app.setPath('userData', `${app.getPath('userData')} (development)`);
3131
}
3232

33-
// TODO: https://github.com/th-ch/youtube-music/blob/master/plugins/adblocker/blocker.js
34-
3533
(async () => {
3634
await app.whenReady();
3735

@@ -76,13 +74,7 @@ if (isProd) {
7674
},
7775
});
7876

79-
mainWindow.webContents.session.webRequest.onHeadersReceived({ urls: ['*://*/*'] }, (details, callback) => {
80-
const responseHeaders = omitBy({ ...(details?.responseHeaders ?? {}) }, (value, key) =>
81-
['x-frame-options', 'content-security-policy'].includes(toLower(key))
82-
);
83-
84-
callback({ cancel: false, responseHeaders });
85-
});
77+
await omitSecurityHeadersAndBlockAds(mainWindow.webContents.session);
8678

8779
mainWindow.setVisibleOnAllWorkspaces(true);
8880

@@ -140,6 +132,8 @@ if (isProd) {
140132
}
141133
});
142134

135+
mainWindow.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
136+
143137
if (isProd) {
144138
await mainWindow.loadURL('app://./index.html');
145139

main/helpers/web-requests.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { ElectronBlocker, fullLists, Request } from '@cliqz/adblocker-electron';
2+
import { app, Session } from 'electron';
3+
import { readFile, writeFile } from 'fs/promises';
4+
import { omitBy, toLower } from 'lodash';
5+
import fetch from 'node-fetch';
6+
import path from 'path';
7+
8+
const verbose = false; // change to true for request block logs
9+
const engineCacheVersion = 1;
10+
11+
// Extra sources thanks to https://github.com/th-ch/youtube-music/blob/master/plugins/adblocker/blocker.js
12+
const SOURCES = [
13+
'https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt',
14+
// uBlock Origin
15+
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt',
16+
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2021.txt',
17+
// Fanboy Annoyances
18+
'https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt',
19+
];
20+
21+
export async function omitSecurityHeadersAndBlockAds(session: Session) {
22+
const cachingOptions = {
23+
path: path.resolve(app.getPath('userData'), `ad-blocker-engine-v${engineCacheVersion}.bin`),
24+
read: readFile,
25+
write: writeFile,
26+
};
27+
28+
const blocker = await ElectronBlocker.fromLists(
29+
fetch,
30+
[...fullLists, ...SOURCES],
31+
{ loadNetworkFilters: true },
32+
cachingOptions
33+
);
34+
blocker.enableBlockingInSession(session);
35+
36+
session.webRequest.onHeadersReceived({ urls: ['*://*/*'] }, (details, callback) => {
37+
const responseHeaders = omitBy({ ...(details?.responseHeaders ?? {}) }, (value, key) =>
38+
['x-frame-options', 'content-security-policy'].includes(toLower(key))
39+
);
40+
41+
callback({ cancel: false, responseHeaders });
42+
});
43+
44+
if (process.env.NODE_ENV === 'development' && verbose) {
45+
blocker.on('request-allowed', (request: Request) => {
46+
console.log('allowed', request.tabId, request.url);
47+
});
48+
49+
blocker.on('request-blocked', (request: Request) => {
50+
console.log('blocked', request.tabId, request.url);
51+
});
52+
53+
blocker.on('request-redirected', (request: Request) => {
54+
console.log('redirected', request.tabId, request.url);
55+
});
56+
57+
blocker.on('request-whitelisted', (request: Request) => {
58+
console.log('whitelisted', request.tabId, request.url);
59+
});
60+
61+
blocker.on('csp-injected', (request: Request) => {
62+
console.log('csp', request.url);
63+
});
64+
65+
blocker.on('script-injected', (script: string, url: string) => {
66+
console.log('script', script.length, url);
67+
});
68+
69+
blocker.on('style-injected', (style: string, url: string) => {
70+
console.log('style', style.length, url);
71+
});
72+
}
73+
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"private": true,
33
"name": "Flot",
44
"description": "Open websites in a floating window",
5-
"version": "1.3.2",
5+
"version": "1.4.0",
66
"author": {
77
"name": "Andrew Brey",
88
"email": "[email protected]"
@@ -24,6 +24,7 @@
2424
"postinstall": "electron-builder install-app-deps"
2525
},
2626
"dependencies": {
27+
"@cliqz/adblocker-electron": "1.22.5",
2728
"@headlessui/react": "1.4.1",
2829
"@heroicons/react": "1.0.4",
2930
"classnames": "2.3.1",

renderer/public/css/embed.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
}
7373

7474
.flotapp.flot-video :not(video) {
75-
height: 0 !important;
75+
pointer-events: none !important;
7676
visibility: hidden !important;
7777
overflow: hidden !important;
7878
}

yarn.lock

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,48 @@
946946
"@babel/helper-validator-identifier" "^7.14.9"
947947
to-fast-properties "^2.0.0"
948948

949+
"@cliqz/adblocker-content@^1.22.5":
950+
version "1.22.5"
951+
resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.22.5.tgz#84a82a630b3824623fff203ffaa9f4831f902eaa"
952+
integrity sha512-79UAWMLZ5Na3FJey/RkYbUcPsmRbfkWq7LzUVffRR+yL8B24P6ptd+T7/qBFAULbJ0unp1DBtJ/i1P1QOPktXw==
953+
dependencies:
954+
"@cliqz/adblocker-extended-selectors" "^1.22.5"
955+
956+
"@cliqz/adblocker-electron-preload@^1.22.5":
957+
version "1.22.5"
958+
resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.22.5.tgz#3a9067279bdab0fd5e6d147b5a36c15c2273c83d"
959+
integrity sha512-O0Baz5SXT4cSGkwcmPiTFWmeLGFYy/vQxRsh2C8sJzkmCj8593rHOVgvVUL4M9o1wKTh+RycmWpoi6dWu75mZw==
960+
dependencies:
961+
"@cliqz/adblocker-content" "^1.22.5"
962+
963+
964+
version "1.22.5"
965+
resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.22.5.tgz#3b45851d47c1835bb7f6476f4e29ae43606c90cf"
966+
integrity sha512-yAfbPszTT5ZDIA4PfPwoImdUJLhAMXZg9G2wfpZP3uadMZHS6E1wJaufjMelDDo/UL5xjH/Mi4ZCRmGZPhZ7Wg==
967+
dependencies:
968+
"@cliqz/adblocker" "^1.22.5"
969+
"@cliqz/adblocker-electron-preload" "^1.22.5"
970+
tldts-experimental "^5.6.21"
971+
972+
"@cliqz/adblocker-extended-selectors@^1.22.5":
973+
version "1.22.5"
974+
resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.22.5.tgz#228fdec6a58e313225a0be4266529f495432db0e"
975+
integrity sha512-5HTrNq1TaTXpTOddBo7z7GMEE7r44J6HusMVaDmbMpoA115YoQJyMfD82OYgoddj4Zdvp63/pjP+MBlE0WZyJg==
976+
977+
"@cliqz/adblocker@^1.22.5":
978+
version "1.22.5"
979+
resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.22.5.tgz#26e675078db9d9854f295a87e969db0c95a15764"
980+
integrity sha512-hQSyedelwG2+D6RDorJkarIUd9mln5IyxnRKO4ADGXvdQhZ5G/E90bTyJ2apDBdnvaUwXpmhhXs2cK12HhN14g==
981+
dependencies:
982+
"@cliqz/adblocker-content" "^1.22.5"
983+
"@cliqz/adblocker-extended-selectors" "^1.22.5"
984+
"@remusao/guess-url-type" "^1.1.2"
985+
"@remusao/small" "^1.1.2"
986+
"@remusao/smaz" "^1.7.1"
987+
"@types/chrome" "^0.0.154"
988+
"@types/firefox-webext-browser" "^82.0.0"
989+
tldts-experimental "^5.6.21"
990+
949991
"@develar/schema-utils@~2.6.5":
950992
version "2.6.5"
951993
resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6"
@@ -1105,6 +1147,41 @@
11051147
"@nodelib/fs.scandir" "2.1.5"
11061148
fastq "^1.6.0"
11071149

1150+
"@remusao/guess-url-type@^1.1.2":
1151+
version "1.2.1"
1152+
resolved "https://registry.yarnpkg.com/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz#b3e7c32abdf98d0fb4f93cc67cad580b5fe4ba57"
1153+
integrity sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==
1154+
1155+
"@remusao/small@^1.1.2":
1156+
version "1.2.1"
1157+
resolved "https://registry.yarnpkg.com/@remusao/small/-/small-1.2.1.tgz#63bfe4548832289f94ac868a0c305970c9a0e5f9"
1158+
integrity sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==
1159+
1160+
"@remusao/smaz-compress@^1.9.1":
1161+
version "1.9.1"
1162+
resolved "https://registry.yarnpkg.com/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz#fc75eaf9bcac2d58bc4c3d518183a7cb9612d275"
1163+
integrity sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==
1164+
dependencies:
1165+
"@remusao/trie" "^1.4.1"
1166+
1167+
"@remusao/smaz-decompress@^1.9.1":
1168+
version "1.9.1"
1169+
resolved "https://registry.yarnpkg.com/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz#8094f997e8fb591a678cda9cf08c209c825eba5b"
1170+
integrity sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==
1171+
1172+
"@remusao/smaz@^1.7.1":
1173+
version "1.9.1"
1174+
resolved "https://registry.yarnpkg.com/@remusao/smaz/-/smaz-1.9.1.tgz#a2b9b045385f81e1615a68d932b7cc8b04c9db8d"
1175+
integrity sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==
1176+
dependencies:
1177+
"@remusao/smaz-compress" "^1.9.1"
1178+
"@remusao/smaz-decompress" "^1.9.1"
1179+
1180+
"@remusao/trie@^1.4.1":
1181+
version "1.4.1"
1182+
resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.4.1.tgz#755d09f8a007476334e611f42719b2d581f00720"
1183+
integrity sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==
1184+
11081185
"@sindresorhus/is@^0.14.0":
11091186
version "0.14.0"
11101187
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -1124,6 +1201,14 @@
11241201
dependencies:
11251202
mini-svg-data-uri "^1.2.3"
11261203

1204+
"@types/chrome@^0.0.154":
1205+
version "0.0.154"
1206+
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.154.tgz#7992e97364f4447e961028ad07ac843d0b052c2d"
1207+
integrity sha512-6QmP744MeMUZUIUHED4d4L2la5dIF1e6bcrkGF4yGQTyO94ER+r++Ss165wkzA5cAGUYt8kToDa6L9xtNqVMxg==
1208+
dependencies:
1209+
"@types/filesystem" "*"
1210+
"@types/har-format" "*"
1211+
11271212
"@types/debug@^4.1.5":
11281213
version "4.1.7"
11291214
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
@@ -1152,6 +1237,23 @@
11521237
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
11531238
integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
11541239

1240+
"@types/filesystem@*":
1241+
version "0.0.32"
1242+
resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf"
1243+
integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==
1244+
dependencies:
1245+
"@types/filewriter" "*"
1246+
1247+
"@types/filewriter@*":
1248+
version "0.0.29"
1249+
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee"
1250+
integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
1251+
1252+
"@types/firefox-webext-browser@^82.0.0":
1253+
version "82.0.1"
1254+
resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-82.0.1.tgz#197dec1d175b099eb8dac92e9c9c9a5482a5dd8a"
1255+
integrity sha512-odcPKiJ34N8k53clIWen3hLvl09ja7SQ9NqtUbgmqeJ/a/ZRQiF665iXSFPcnl6cBn2XQgEg2lsUUApYNiyj+g==
1256+
11551257
"@types/fs-extra@^9.0.11":
11561258
version "9.0.12"
11571259
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.12.tgz#9b8f27973df8a7a3920e8461517ebf8a7d4fdfaf"
@@ -1167,6 +1269,11 @@
11671269
"@types/minimatch" "*"
11681270
"@types/node" "*"
11691271

1272+
"@types/har-format@*":
1273+
version "1.2.7"
1274+
resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.7.tgz#debfe36378f26c4fc2abca1df99f00a8ff94fd29"
1275+
integrity sha512-/TPzUG0tJn5x1TUcVLlDx2LqbE58hyOzDVAc9kf8SpOEmguHjU6bKUyfqb211AdqLOmU/SNyXvLKPNP5qTlfRw==
1276+
11701277
"@types/js-cookie@^2.2.6":
11711278
version "2.2.7"
11721279
resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3"
@@ -6624,6 +6731,18 @@ [email protected], timers-browserify@^2.0.4:
66246731
dependencies:
66256732
setimmediate "^1.0.4"
66266733

6734+
tldts-core@^5.7.43:
6735+
version "5.7.43"
6736+
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.43.tgz#0f2dfb323519035b0a17e28454997841c919c8a1"
6737+
integrity sha512-wRc782c70Khcaa7wTxl2ddWN4Z9QLDBspYK+VU3gDmMingXP2qkSatayxPYP1qjUJgvOBsuKeuFzNllrCDyWww==
6738+
6739+
tldts-experimental@^5.6.21:
6740+
version "5.7.43"
6741+
resolved "https://registry.yarnpkg.com/tldts-experimental/-/tldts-experimental-5.7.43.tgz#636ad6bd0544eb611ec25a85b46bac53192b5101"
6742+
integrity sha512-NeRBaa0vWNCqXYzSgtyOkvjnUS+pXHNFWwVdDfD3OmcV/gKstcBY9EFcRxGW2sG8vmy6ojxkrzXvKvZD/JzOOg==
6743+
dependencies:
6744+
tldts-core "^5.7.43"
6745+
66276746
tmp-promise@^3.0.2:
66286747
version "3.0.2"
66296748
resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a"

0 commit comments

Comments
 (0)