forked from mirrors/gecko-dev
Bug 1804464 - Only allow tabIds/excludeTabIds in session rulesets. r=robwu
Differential Revision: https://phabricator.services.mozilla.com/D163653
This commit is contained in:
parent
a3c18883ef
commit
2af43c440f
3 changed files with 87 additions and 2 deletions
|
|
@ -744,9 +744,10 @@ class ModifyResponseHeaders extends ModifyHeadersBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
class RuleValidator {
|
class RuleValidator {
|
||||||
constructor(alreadyValidatedRules) {
|
constructor(alreadyValidatedRules, { isSessionRuleset = false } = {}) {
|
||||||
this.rulesMap = new Map(alreadyValidatedRules.map(r => [r.id, r]));
|
this.rulesMap = new Map(alreadyValidatedRules.map(r => [r.id, r]));
|
||||||
this.failures = [];
|
this.failures = [];
|
||||||
|
this.isSessionRuleset = isSessionRuleset;
|
||||||
}
|
}
|
||||||
|
|
||||||
removeRuleIds(ruleIds) {
|
removeRuleIds(ruleIds) {
|
||||||
|
|
@ -845,6 +846,15 @@ class RuleValidator {
|
||||||
// Checks: tabIds & excludedTabIds
|
// Checks: tabIds & excludedTabIds
|
||||||
#checkCondTabIds(rule) {
|
#checkCondTabIds(rule) {
|
||||||
const { tabIds, excludedTabIds } = rule.condition;
|
const { tabIds, excludedTabIds } = rule.condition;
|
||||||
|
|
||||||
|
if ((tabIds || excludedTabIds) && !this.isSessionRuleset) {
|
||||||
|
this.#collectInvalidRule(
|
||||||
|
rule,
|
||||||
|
"tabIds and excludedTabIds can only be specified in session rules"
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.#hasOverlap(tabIds, excludedTabIds)) {
|
if (this.#hasOverlap(tabIds, excludedTabIds)) {
|
||||||
this.#collectInvalidRule(
|
this.#collectInvalidRule(
|
||||||
rule,
|
rule,
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,8 @@ this.declarativeNetRequest = class extends ExtensionAPI {
|
||||||
updateSessionRules({ removeRuleIds, addRules }) {
|
updateSessionRules({ removeRuleIds, addRules }) {
|
||||||
const ruleManager = ExtensionDNR.getRuleManager(extension);
|
const ruleManager = ExtensionDNR.getRuleManager(extension);
|
||||||
let ruleValidator = new ExtensionDNR.RuleValidator(
|
let ruleValidator = new ExtensionDNR.RuleValidator(
|
||||||
ruleManager.getSessionRules()
|
ruleManager.getSessionRules(),
|
||||||
|
{ isSessionRuleset: true }
|
||||||
);
|
);
|
||||||
if (removeRuleIds) {
|
if (removeRuleIds) {
|
||||||
ruleValidator.removeRuleIds(removeRuleIds);
|
ruleValidator.removeRuleIds(removeRuleIds);
|
||||||
|
|
|
||||||
|
|
@ -1276,3 +1276,77 @@ add_task(async function test_static_rulesets_limits() {
|
||||||
|
|
||||||
await extension.unload();
|
await extension.unload();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
add_task(async function test_tabId_conditions_invalid_in_static_rules() {
|
||||||
|
const ruleset1_with_tabId_condition = [
|
||||||
|
getDNRRule({ id: 1, condition: { tabIds: [1] } }),
|
||||||
|
getDNRRule({ id: 3, condition: { urlFilter: "valid-ruleset1-rule" } }),
|
||||||
|
];
|
||||||
|
|
||||||
|
const ruleset2_with_excludeTabId_condition = [
|
||||||
|
getDNRRule({ id: 2, condition: { excludedTabIds: [1] } }),
|
||||||
|
getDNRRule({ id: 3, condition: { urlFilter: "valid-ruleset2-rule" } }),
|
||||||
|
];
|
||||||
|
|
||||||
|
const rule_resources = [
|
||||||
|
{
|
||||||
|
id: "ruleset1_with_tabId_condition",
|
||||||
|
enabled: true,
|
||||||
|
path: "ruleset1.json",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "ruleset2_with_excludeTabId_condition",
|
||||||
|
enabled: true,
|
||||||
|
path: "ruleset2.json",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const files = {
|
||||||
|
"ruleset1.json": JSON.stringify(ruleset1_with_tabId_condition),
|
||||||
|
"ruleset2.json": JSON.stringify(ruleset2_with_excludeTabId_condition),
|
||||||
|
};
|
||||||
|
|
||||||
|
const extension = ExtensionTestUtils.loadExtension(
|
||||||
|
getDNRExtension({
|
||||||
|
id: "tabId-invalid-in-session-rules@mochitest",
|
||||||
|
rule_resources,
|
||||||
|
files,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
const { messages } = await AddonTestUtils.promiseConsoleOutput(async () => {
|
||||||
|
ExtensionTestUtils.failOnSchemaWarnings(false);
|
||||||
|
await extension.startup();
|
||||||
|
ExtensionTestUtils.failOnSchemaWarnings(true);
|
||||||
|
await extension.awaitMessage("bgpage:ready");
|
||||||
|
await assertDNRGetEnabledRulesets(extension, [
|
||||||
|
"ruleset1_with_tabId_condition",
|
||||||
|
"ruleset2_with_excludeTabId_condition",
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddonTestUtils.checkMessages(messages, {
|
||||||
|
expected: [
|
||||||
|
{
|
||||||
|
message: /ruleset1.json: tabIds and excludedTabIds can only be specified in session rules/,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
message: /ruleset2.json: tabIds and excludedTabIds can only be specified in session rules/,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
info("Expect the invalid rule to not be enabled");
|
||||||
|
const dnrStore = ExtensionDNRStore._getStoreForTesting();
|
||||||
|
// Expect the two valid rules to have been loaded as expected.
|
||||||
|
await assertDNRStoreData(dnrStore, extension, {
|
||||||
|
ruleset1_with_tabId_condition: getSchemaNormalizedRules(extension, [
|
||||||
|
ruleset1_with_tabId_condition[1],
|
||||||
|
]),
|
||||||
|
ruleset2_with_excludeTabId_condition: getSchemaNormalizedRules(extension, [
|
||||||
|
ruleset2_with_excludeTabId_condition[1],
|
||||||
|
]),
|
||||||
|
});
|
||||||
|
|
||||||
|
await extension.unload();
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue