Skip to content

Commit 5b3c1fa

Browse files
committed
Converter module
1 parent 1004dc7 commit 5b3c1fa

File tree

2 files changed

+87
-68
lines changed

2 files changed

+87
-68
lines changed

extension-manifest-v3/src/pages/settings/components/custom-filters.js

+32-68
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,9 @@
1111

1212
import { html, store } from 'hybrids';
1313
import { detectFilterType } from '@cliqz/adblocker';
14+
import createConverter from '../dnr-converter';
1415

15-
function onConvertedRules(host, event) {
16-
if (!event.data.rules || !event.data.errors) {
17-
return;
18-
}
19-
20-
console.log("DNR converstion", event.data)
21-
if (event.data.errors.length > 0) {
22-
// host.conversionResult.errors.push(...event.data.errors);
23-
}
24-
}
16+
const converter = createConverter();
2517

2618
function updateCustomFilters(host) {
2719
store.submit(host.input);
@@ -40,7 +32,7 @@ const CustomFiltersInput = {
4032
},
4133
async set(_, { text }) {
4234
await chrome.storage.local.set({ 'custom-filters-input': text });
43-
return { text, id: 1, };
35+
return { text, id: 1 };
4436
},
4537
},
4638
};
@@ -50,7 +42,10 @@ export default {
5042
errors: { set: (_, values = []) => values },
5143
output: async (host) => {
5244
const { text } = await store.resolve(host.input);
53-
const filters = text.split('\n').map(f => f.trim()).filter(Boolean);
45+
const filters = text
46+
.split('\n')
47+
.map((f) => f.trim())
48+
.filter(Boolean);
5449

5550
const output = {
5651
networkFilters: [],
@@ -69,56 +64,23 @@ export default {
6964
output.cosmeticFilters.push(filter);
7065
break;
7166
default:
72-
output.errors.push(
73-
`Filter not supported: '${filter}'`,
74-
);
67+
output.errors.push(`Filter not supported: '${filter}'`);
7568
}
7669
}
7770

78-
const { convert } = await host.converter;
7971
for (const networkFilter of output.networkFilters) {
80-
convert(networkFilter);
72+
converter.convert(networkFilter);
8173
}
8274

8375
return output;
8476
},
85-
converter: {
86-
async get(host) {
87-
return new Promise(resolve => {
88-
const iframe = host.querySelector('iframe');
89-
const convert = (filter) => {
90-
iframe.contentWindow.postMessage(
91-
{
92-
action: 'convert',
93-
converter: 'adguard',
94-
filters: [filter],
95-
},
96-
'*',
97-
);
98-
};
99-
iframe.addEventListener('load', () => {
100-
resolve({ convert });
101-
});
102-
})
103-
},
104-
connect(host) {
105-
const onMessage = onConvertedRules.bind(null, host);
106-
107-
window.addEventListener('message', onMessage);
108-
109-
return () => {
110-
window.removeEventListener('message', onMessage);
111-
};
112-
},
113-
},
11477
content: ({ input, output }) => html`
11578
<template layout="column gap:3">
116-
<iframe
117-
layout="hidden"
118-
src="https://ghostery.github.io/urlfilter2dnr/"
119-
></iframe>
120-
${store.ready(input) && html`
121-
<textarea rows="10" oninput="${html.set(input, 'text')}">${input.text}</textarea>
79+
${store.ready(input) &&
80+
html`
81+
<textarea rows="10" oninput="${html.set(input, 'text')}">
82+
${input.text}</textarea
83+
>
12284
`}
12385
<div layout="row gap items:center">
12486
<ui-button
@@ -130,22 +92,24 @@ export default {
13092
<button>Update</button>
13193
</ui-button>
13294
${html.resolve(
133-
output.then(({ networkFilters, cosmeticFilters, errors }) => html`
134-
<section layout="row gap items:center">
135-
<ul>
136-
${errors.map(
137-
(error) =>
138-
html`<li>
139-
<ui-text color="danger-500">${error}</ui-text>
140-
</li>`,
141-
)}
142-
</ul>
143-
</section>
144-
<section layout="row gap items:center">
145-
Network filters: ${networkFilters.length}
146-
Cosmetic filters: ${cosmeticFilters.length}
147-
</section>
148-
`)
95+
output.then(
96+
({ networkFilters, cosmeticFilters, errors }) => html`
97+
<section layout="row gap items:center">
98+
<ul>
99+
${errors.map(
100+
(error) =>
101+
html`<li>
102+
<ui-text color="danger-500">${error}</ui-text>
103+
</li>`,
104+
)}
105+
</ul>
106+
</section>
107+
<section layout="row gap items:center">
108+
Network filters: ${networkFilters.length} Cosmetic filters:
109+
${cosmeticFilters.length}
110+
</section>
111+
`,
112+
),
149113
)}
150114
</div>
151115
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Ghostery Browser Extension
3+
* https://www.ghostery.com/
4+
*
5+
* Copyright 2017-present Ghostery GmbH. All rights reserved.
6+
*
7+
* This Source Code Form is subject to the terms of the Mozilla Public
8+
* License, v. 2.0. If a copy of the MPL was not distributed with this
9+
* file, You can obtain one at http://mozilla.org/MPL/2.0
10+
*/
11+
12+
const requests = new Map();
13+
let requestCount = 0;
14+
let iframe;
15+
let isReadyResolver;
16+
let isReady = new Promise((resolve) => {
17+
isReadyResolver = resolve;
18+
});
19+
20+
function createConverter() {
21+
if (!iframe) {
22+
window.addEventListener('message', (event) => {
23+
const requestId = event.data.rules.shift().condition.urlFilter;
24+
requests.get(requestId)(event.data);
25+
requests.delete(requestId);
26+
});
27+
28+
iframe = document.createElement('iframe');
29+
iframe.setAttribute('src', 'https://ghostery.github.io/urlfilter2dnr/');
30+
iframe.setAttribute('style', 'display: none;');
31+
iframe.addEventListener('load', isReadyResolver);
32+
33+
document.body.appendChild(iframe);
34+
}
35+
36+
return {
37+
convert: async (filter) => {
38+
await isReady;
39+
const requestId = `request${requestCount++}`;
40+
iframe.contentWindow.postMessage(
41+
{
42+
action: 'convert',
43+
converter: 'adguard',
44+
filters: [requestId, filter],
45+
},
46+
'*',
47+
);
48+
return new Promise((resolve) => {
49+
requests.set(requestId, resolve);
50+
});
51+
},
52+
};
53+
}
54+
55+
export default createConverter;

0 commit comments

Comments
 (0)