Skip to content

Commit bb3d332

Browse files
committed
Transform AST manually
1 parent 78bd1d5 commit bb3d332

File tree

6 files changed

+83
-499
lines changed

6 files changed

+83
-499
lines changed

lib/background.js

+18-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import browser from 'webextension-polyfill';
22
import transform from './transform.js';
33

4-
function jsHandler(details) {
5-
let filter = browser.webRequest.filterResponseData(details.requestId);
4+
function jsHandler(event) {
5+
let filter = browser.webRequest.filterResponseData(event.requestId);
66

77
let buf = '';
88
let decoder = new TextDecoder('utf-8');
@@ -12,19 +12,26 @@ function jsHandler(details) {
1212
buf += decoder.decode(event.data, { stream: true });
1313
};
1414

15-
filter.onstop = async () => {
16-
const script = await transform(buf);
15+
filter.onstop = () => {
16+
const script = transform(buf);
1717
filter.write(encoder.encode(script));
1818
filter.disconnect();
1919
};
2020

2121
return {};
2222
}
2323

24-
browser.webRequest.onBeforeRequest.addListener(
25-
jsHandler,
26-
{
27-
urls: ["https://d35iw2jmbg6ut8.cloudfront.net/static/js/*.js"]
28-
},
29-
["blocking"]
30-
);
24+
function requestCacheHandler(event) {
25+
return {
26+
requestHeaders: event.requestHeaders.filter(x => !['if-none-match', 'if-modified-since'].includes(x.name.toLowerCase()))
27+
};
28+
}
29+
30+
const filter = {
31+
urls: ['https://d35iw2jmbg6ut8.cloudfront.net/static/js/main.*.chunk.js']
32+
};
33+
34+
browser.webRequest.onBeforeRequest.addListener(jsHandler, filter, ['blocking']);
35+
browser.webRequest.onBeforeSendHeaders.addListener(requestCacheHandler, filter, ['blocking', 'requestHeaders']);
36+
37+
browser.webRequest.handlerBehaviorChanged();

lib/transform.js

+23-11
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
1-
import { transformAsync } from '@babel/core';
21
import alwaysFk from './transforms/alwaysFk.js';
2+
import { parseScript } from 'meriyah';
3+
import { walk } from 'estree-walker';
4+
import { generate } from 'astring';
35

4-
const options = {
5-
plugins: [alwaysFk],
6-
generatorOpts: {
7-
compact: true
8-
}
9-
};
10-
11-
export default async function transform(source) {
6+
export default function transform(source) {
127
console.time('transforming');
13-
const { code } = await transformAsync(source, options);
8+
9+
console.time('parsing');
10+
const ast = parseScript(source);
11+
console.timeEnd('parsing');
12+
13+
console.time('walking');
14+
walk(ast, {
15+
enter(node) {
16+
alwaysFk(node, this);
17+
}
18+
});
19+
console.timeEnd('walking');
20+
21+
console.time('writing');
22+
const transformed = generate(ast);
23+
console.timeEnd('writing');
24+
1425
console.timeEnd('transforming');
15-
return code;
26+
27+
return transformed;
1628
}

lib/transforms/alwaysFk.js

+18-22
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
1-
export default function({ types: t }) {
2-
return {
3-
visitor: {
4-
ConditionalExpression(path) {
5-
if (t.isLogicalExpression(path.node.test)) {
6-
if (path.node.test.operator !== '&&') return;
7-
if (!t.isBinaryExpression(path.node.test.left)) return;
8-
if (!t.isMemberExpression(path.node.test.left.right)) return;
9-
if (path.node.test.left.right.computed) return;
10-
if (path.node.test.left.right.property.name !== 'Forbidden_Knowledge_Access') return;
1+
export default function alwaysFk(node, ctx) {
2+
if (node.type !== 'ConditionalExpression') return;
113

12-
if (t.isBinaryExpression(path.node.test.right) && t.isStringLiteral(path.node.test.right.left)) {
13-
path.node.test = path.node.test.right;
14-
} else {
15-
path.replaceWith(path.node.consequent);
16-
}
17-
} else if (t.isBinaryExpression(path.node.test)) {
18-
if (!t.isMemberExpression(path.node.test.right)) return;
19-
if (path.node.test.right.computed) return;
20-
if (path.node.test.right.property.name !== 'Forbidden_Knowledge_Access') return;
4+
if (node.test.type === 'LogicalExpression') {
5+
if (node.test.operator !== '&&') return;
6+
if (node.test.left.type !== 'BinaryExpression') return;
7+
if (node.test.left.right.type !== 'MemberExpression') return;
8+
if (node.test.left.right.computed) return;
9+
if (node.test.left.right.property.name !== 'Forbidden_Knowledge_Access') return;
2110

22-
path.replaceWith(path.node.consequent);
23-
}
24-
}
11+
if (node.test.right.type === 'BinaryExpression' && node.test.right.left.type === 'Literal') {
12+
node.test = node.test.right;
13+
} else {
14+
ctx.replace(node.consequent);
2515
}
16+
} else if (node.test.type === 'BinaryExpression') {
17+
if (node.test.right.type !== 'MemberExpression') return;
18+
if (node.test.right.computed) return;
19+
if (node.test.right.property.name !== 'Forbidden_Knowledge_Access') return;
20+
21+
ctx.replace(node.consequent);
2622
}
2723
}

package.json

+3-5
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,11 @@
3030
"webpack-cli": "^4.5.0"
3131
},
3232
"dependencies": {
33-
"@babel/core": "^7.13.15",
3433
"@popperjs/core": "^2.8.6",
35-
"assert": "^2.0.0",
36-
"buffer": "^6.0.3",
34+
"astring": "^1.7.4",
3735
"camelcase": "^6.2.0",
38-
"path-browserify": "^1.0.1",
39-
"process": "^0.11.10",
36+
"estree-walker": "^3.0.0",
37+
"meriyah": "^4.1.5",
4038
"webextension-polyfill": "^0.7.0"
4139
},
4240
"type": "module"

webpack.config.mjs

-15
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import { dirname, resolve } from 'path';
22
import { fileURLToPath } from 'url';
33
import WebExtWebpackPlugin from '@leo60228/web-ext-webpack-plugin';
4-
import { createRequire } from 'module';
5-
import webpack from 'webpack';
6-
7-
const require = createRequire(import.meta.url);
84

95
const cwd = dirname(fileURLToPath(import.meta.url));
106
const addonDir = resolve(cwd, 'addon');
@@ -31,10 +27,6 @@ const config = env => ({
3127
firefoxProfile: resolve(cwd, '.ff-profile'),
3228
profileCreateIfMissing: true,
3329
keepProfileChanges: true
34-
}),
35-
new webpack.ProvidePlugin({
36-
process: 'process/browser',
37-
Buffer: 'buffer/'
3830
})
3931
],
4032
node: {
@@ -51,13 +43,6 @@ const config = env => ({
5143
type: 'asset/source'
5244
}
5345
]
54-
},
55-
resolve: {
56-
fallback: {
57-
path: require.resolve('path-browserify'),
58-
assert: require.resolve('assert/'),
59-
fs: false
60-
}
6146
}
6247
});
6348

0 commit comments

Comments
 (0)