11//! Holds [`Blocker`], which handles all network-based adblocking queries.
22
33use memchr:: { memchr as find_char, memrchr as find_char_reverse} ;
4- use once_cell:: sync:: Lazy ;
54use serde:: Serialize ;
65use std:: collections:: HashSet ;
76use std:: ops:: DerefMut ;
7+ use std:: sync:: OnceLock ;
88
99use crate :: filters:: fb_network_builder:: NetworkFilterListId ;
1010use crate :: filters:: filter_data_context:: FilterDataContextRef ;
@@ -63,7 +63,10 @@ pub struct BlockerResult {
6363
6464// only check for tags in tagged and exception rule buckets,
6565// pass empty set for the rest
66- static NO_TAGS : Lazy < HashSet < String > > = Lazy :: new ( HashSet :: new) ;
66+ fn get_no_tags ( ) -> & ' static HashSet < String > {
67+ static NO_TAGS : OnceLock < HashSet < String > > = OnceLock :: new ( ) ;
68+ NO_TAGS . get_or_init ( & HashSet :: new)
69+ }
6770
6871/// Stores network filters for efficient querying.
6972pub struct Blocker {
@@ -186,13 +189,16 @@ impl Blocker {
186189 // Always check important filters
187190 let important_filter = self
188191 . importants ( )
189- . check ( request, & NO_TAGS , & mut regex_manager) ;
192+ . check ( request, get_no_tags ( ) , & mut regex_manager) ;
190193
191194 // only check the rest of the rules if not previously matched
192195 let filter = if important_filter. is_none ( ) && !matched_rule {
193196 self . tagged_filters_all ( )
194197 . check ( request, & self . tags_enabled , & mut regex_manager)
195- . or_else ( || self . filters ( ) . check ( request, & NO_TAGS , & mut regex_manager) )
198+ . or_else ( || {
199+ self . filters ( )
200+ . check ( request, get_no_tags ( ) , & mut regex_manager)
201+ } )
196202 } else {
197203 important_filter
198204 } ;
@@ -213,7 +219,7 @@ impl Blocker {
213219
214220 let redirect_filters =
215221 self . redirects ( )
216- . check_all ( request, & NO_TAGS , regex_manager. deref_mut ( ) ) ;
222+ . check_all ( request, get_no_tags ( ) , regex_manager. deref_mut ( ) ) ;
217223
218224 // Extract the highest priority redirect directive.
219225 // 1. Exceptions - can bail immediately if found
@@ -339,7 +345,7 @@ impl Blocker {
339345 . map ( |param| ( param, true ) )
340346 . collect ( ) ;
341347
342- let filters = removeparam_filters. check_all ( request, & NO_TAGS , regex_manager) ;
348+ let filters = removeparam_filters. check_all ( request, get_no_tags ( ) , regex_manager) ;
343349 let mut rewrite = false ;
344350 for removeparam_filter in filters {
345351 if let Some ( removeparam) = & removeparam_filter. modifier_option {
0 commit comments