Skip to content

Commit 6e8ec0d

Browse files
committed
parse procedural filters with has-text
1 parent bb9ed5c commit 6e8ec0d

File tree

3 files changed

+323
-84
lines changed

3 files changed

+323
-84
lines changed

src/content_blocking.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ pub enum CbRuleCreationFailure {
204204
RuleContainsNonASCII,
205205
/// `from` as a `domain` alias is not currently supported in content blocking syntax.
206206
FromNotSupported,
207+
/// Content blocking rules cannot support procedural cosmetic filter operators.
208+
ProceduralCosmeticFiltersUnsupported,
207209
}
208210

209211
impl TryFrom<ParsedFilter> for CbRuleEquivalent {
@@ -567,7 +569,7 @@ impl TryFrom<CosmeticFilter> for CbRule {
567569
return Err(CbRuleCreationFailure::ScriptletInjectionsNotSupported);
568570
}
569571

570-
if let Some(raw_line) = v.raw_line {
572+
if let Some(raw_line) = &v.raw_line {
571573
let mut hostnames_vec = vec![];
572574
let mut not_hostnames_vec = vec![];
573575

@@ -609,10 +611,16 @@ impl TryFrom<CosmeticFilter> for CbRule {
609611
(not_hostnames_vec, hostnames_vec)
610612
};
611613

614+
let selector = if let Some(selector) = v.plain_css_selector() {
615+
selector.to_string()
616+
} else {
617+
return Err(CbRuleCreationFailure::ProceduralCosmeticFiltersUnsupported);
618+
};
619+
612620
let rule = Self {
613621
action: CbAction {
614622
typ: CbType::CssDisplayNone,
615-
selector: Some(v.selector),
623+
selector: Some(selector),
616624
},
617625
trigger: CbTrigger {
618626
url_filter: ".*".to_string(),

src/cosmetic_filter_cache.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,36 +139,37 @@ impl CosmeticFilterCache {
139139

140140
/// Add a filter, assuming it has already been determined to be a generic rule
141141
fn add_generic_filter(&mut self, rule: CosmeticFilter) {
142-
if rule.selector.starts_with('.') {
143-
if let Some(key) = key_from_selector(&rule.selector) {
142+
let selector = rule.plain_css_selector().expect("Procedural cosmetic filters cannot be generic").to_string();
143+
if selector.starts_with('.') {
144+
if let Some(key) = key_from_selector(&selector) {
144145
assert!(key.starts_with('.'));
145146
let class = key[1..].to_string();
146-
if key == rule.selector {
147+
if key == selector {
147148
self.simple_class_rules.insert(class);
148149
} else {
149150
if let Some(bucket) = self.complex_class_rules.get_mut(&class) {
150-
bucket.push(rule.selector);
151+
bucket.push(selector);
151152
} else {
152-
self.complex_class_rules.insert(class, vec![rule.selector]);
153+
self.complex_class_rules.insert(class, vec![selector]);
153154
}
154155
}
155156
}
156-
} else if rule.selector.starts_with('#') {
157-
if let Some(key) = key_from_selector(&rule.selector) {
157+
} else if selector.starts_with('#') {
158+
if let Some(key) = key_from_selector(&selector) {
158159
assert!(key.starts_with('#'));
159160
let id = key[1..].to_string();
160-
if key == rule.selector {
161+
if key == selector {
161162
self.simple_id_rules.insert(id);
162163
} else {
163164
if let Some(bucket) = self.complex_id_rules.get_mut(&id) {
164-
bucket.push(rule.selector);
165+
bucket.push(selector);
165166
} else {
166-
self.complex_id_rules.insert(id, vec![rule.selector]);
167+
self.complex_id_rules.insert(id, vec![selector]);
167168
}
168169
}
169170
}
170171
} else {
171-
self.misc_generic_selectors.insert(rule.selector);
172+
self.misc_generic_selectors.insert(selector);
172173
}
173174
}
174175

@@ -456,9 +457,18 @@ impl HostnameRuleDb {
456457
use crate::filters::cosmetic::CosmeticFilterAction;
457458
use SpecificFilterType::*;
458459

460+
if rule.plain_css_selector().is_none() {
461+
return;
462+
}
463+
459464
let unhide = rule.mask.contains(CosmeticFilterMask::UNHIDE);
460465
let script_inject = rule.mask.contains(CosmeticFilterMask::SCRIPT_INJECT);
461-
let selector = rule.selector;
466+
let selector = if let Some(s) = rule.plain_css_selector() {
467+
s.to_string()
468+
} else {
469+
// procedural filters - unhandled for now
470+
return;
471+
};
462472

463473
let kind = match (unhide, script_inject, rule.action) {
464474
(false, false, None) => Hide(selector),

0 commit comments

Comments
 (0)