diff --git a/packages/core/integration-tests/test/integration/webextension/manifest.json b/packages/core/integration-tests/test/integration/webextension/manifest.json index 19367f29f58..2ceae8fe5e3 100644 --- a/packages/core/integration-tests/test/integration/webextension/manifest.json +++ b/packages/core/integration-tests/test/integration/webextension/manifest.json @@ -26,6 +26,13 @@ "js": ["src/content.js"], "css": ["src/content.css"] }], + "declarative_net_request": { + "rule_resources": [{ + "id": "ruleset_1", + "enabled": true, + "path": "./rulesets/ruleset_1.json" + }] + }, "dictionaries": { "en-US": "./dicts/tmp.dic" }, diff --git a/packages/core/integration-tests/test/integration/webextension/rulesets/ruleset_1.json b/packages/core/integration-tests/test/integration/webextension/rulesets/ruleset_1.json new file mode 100644 index 00000000000..0637a088a01 --- /dev/null +++ b/packages/core/integration-tests/test/integration/webextension/rulesets/ruleset_1.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/core/integration-tests/test/webextension.js b/packages/core/integration-tests/test/webextension.js index 33c52e84eac..c06e06979f1 100644 --- a/packages/core/integration-tests/test/webextension.js +++ b/packages/core/integration-tests/test/webextension.js @@ -35,6 +35,9 @@ describe('webextension', function () { {assets: ['devtools.html']}, {assets: ['content.js']}, {assets: ['content.css']}, + { + assets: ['ruleset_1.json'], + }, ]); assert( await outputFS.exists( @@ -49,6 +52,10 @@ describe('webextension', function () { ); const scripts = manifest.background.scripts; assert.equal(scripts.length, 1); + for (const {path: resourcePath} of manifest.declarative_net_request + ?.rule_resources ?? []) { + assert(await outputFS.exists(path.join(distDir, resourcePath))); + } assert( ( await outputFS.readFile(path.join(distDir, scripts[0]), 'utf-8') diff --git a/packages/transformers/webextension/src/WebExtensionTransformer.js b/packages/transformers/webextension/src/WebExtensionTransformer.js index b3088765ec7..fd4c2f3fbc1 100644 --- a/packages/transformers/webextension/src/WebExtensionTransformer.js +++ b/packages/transformers/webextension/src/WebExtensionTransformer.js @@ -218,6 +218,23 @@ async function collectDependencies( } program.web_accessible_resources = war; } + if (program.declarative_net_request) { + const rrs: {|path: string, id: string, enabled: boolean|}[] = + program.declarative_net_request?.rule_resources ?? []; + rrs.forEach((resources, i) => { + resources.path = asset.addURLDependency(resources.path, { + pipeline: 'raw', + loc: { + filePath, + ...getJSONSourceLocation( + ptrs[`/declarative_net_request/rule_resources/${i}/path`], + 'value', + ), + }, + }); + }); + } + for (const loc of DEP_LOCS) { const location = '/' + loc.join('/'); if (!ptrs[location]) continue; diff --git a/packages/transformers/webextension/src/schema.js b/packages/transformers/webextension/src/schema.js index 98e40e1a2e8..9e9aa114f0c 100644 --- a/packages/transformers/webextension/src/schema.js +++ b/packages/transformers/webextension/src/schema.js @@ -179,6 +179,26 @@ const commonProps = { required: ['matches'], }, }, + declarative_net_request: ({ + type: 'object', + properties: { + rule_resources: { + type: 'array', + items: { + type: 'object', + properties: { + id: string, + enabled: boolean, + path: string, + }, + additionalProperties: false, + required: ['id', 'enabled', 'path'], + }, + }, + }, + additionalProperties: false, + required: ['rule_resources'], + }: SchemaEntity), devtools_page: string, // looks to be FF only dictionaries: ({