From 9283dd749833596a5e6815fd88ff099c13b119fd Mon Sep 17 00:00:00 2001 From: Jorrin Date: Sun, 7 Jan 2024 20:38:05 +0100 Subject: [PATCH] First attempt at declaring rules from main site (not working) --- package.json | 5 ++ .../messages/declarative-net-request.ts | 71 +++++++++++++++++++ .../messages/{proxy.ts => proxy-request.ts} | 0 src/contents/movie-web.ts | 6 +- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/background/messages/declarative-net-request.ts rename src/background/messages/{proxy.ts => proxy-request.ts} (100%) diff --git a/package.json b/package.json index 6a4b258..8166d2d 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,10 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.1.1" + }, + "manifest": { + "permissions": [ + "declarativeNetRequest" + ] } } diff --git a/src/background/messages/declarative-net-request.ts b/src/background/messages/declarative-net-request.ts new file mode 100644 index 0000000..499fd27 --- /dev/null +++ b/src/background/messages/declarative-net-request.ts @@ -0,0 +1,71 @@ +import type { PlasmoMessaging } from '@plasmohq/messaging'; + +interface RequestBody { + ruleId: number; + domain: string; + requestHeaders?: Record; + responseHeaders?: Record; +} + +const mapHeadersToDeclarativeNetRequestHeaders = ( + headers: Record, +): chrome.declarativeNetRequest.ModifyHeaderInfo[] => { + return Object.entries(headers).map(([name, value]) => ({ + header: name, + operation: chrome.declarativeNetRequest.HeaderOperation.SET, + value, + })); +}; + +const handler: PlasmoMessaging.MessageHandler = async (req, res) => { + console.log('declarative-net-request: ', req.body); + try { + await chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds: [req.body.ruleId], + addRules: [ + { + id: req.body.ruleId, + condition: { + initiatorDomains: [req.body.domain], + }, + action: { + type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS, + requestHeaders: mapHeadersToDeclarativeNetRequestHeaders(req.body.requestHeaders ?? {}), + responseHeaders: [ + { + header: 'Access-Control-Allow-Origin', + operation: chrome.declarativeNetRequest.HeaderOperation.SET, + value: '*', + }, + { + header: 'Access-Control-Allow-Methods', + operation: chrome.declarativeNetRequest.HeaderOperation.SET, + value: 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + }, + { + header: 'Access-Control-Allow-Headers', + operation: chrome.declarativeNetRequest.HeaderOperation.SET, + value: '*', + }, + ...mapHeadersToDeclarativeNetRequestHeaders(req.body.responseHeaders ?? {}), + ], + }, + }, + ], + }); + + if (chrome.runtime.lastError?.message) throw new Error(chrome.runtime.lastError.message); + + res.send({ + success: true, + body: req.body, + }); + } catch (err) { + res.send({ + success: false, + error: err.message, + }); + } +}; + +export default handler; diff --git a/src/background/messages/proxy.ts b/src/background/messages/proxy-request.ts similarity index 100% rename from src/background/messages/proxy.ts rename to src/background/messages/proxy-request.ts diff --git a/src/contents/movie-web.ts b/src/contents/movie-web.ts index b0b114c..2508ecf 100644 --- a/src/contents/movie-web.ts +++ b/src/contents/movie-web.ts @@ -7,5 +7,9 @@ export const config: PlasmoCSConfig = { }; relayMessage({ - name: 'proxy', + name: 'proxy-request', +}); + +relayMessage({ + name: 'declarative-net-request', });