@@ -6,6 +6,7 @@ use crate::cosmetic_filter_cache::ProceduralOrActionFilter;
66use crate :: cosmetic_filter_utils:: SpecificFilterType ;
77use crate :: cosmetic_filter_utils:: { encode_script_with_permission, key_from_selector} ;
88use crate :: filters:: cosmetic:: { CosmeticFilter , CosmeticFilterMask , CosmeticFilterOperator } ;
9+ use crate :: filters:: fb_builder:: { EngineFlatBuilder , ShareableString } ;
910use crate :: filters:: flatbuffer_generated:: fb;
1011use crate :: flatbuffers:: containers:: flat_map:: FlatMapBuilder ;
1112use crate :: flatbuffers:: containers:: flat_multimap:: FlatMultiMapBuilder ;
@@ -27,18 +28,18 @@ use flatbuffers::WIPOffset;
2728/// See HostnameSpecificRules declaration for more details.
2829#[ derive( Default ) ]
2930struct HostnameRule {
30- unhide : Vec < String > ,
31- uninject_script : Vec < String > ,
32- procedural_action : Vec < String > ,
33- procedural_action_exception : Vec < String > ,
31+ unhide : Vec < ShareableString > ,
32+ uninject_script : Vec < ShareableString > ,
33+ procedural_action : Vec < ShareableString > ,
34+ procedural_action_exception : Vec < ShareableString > ,
3435}
3536
36- impl < ' a , B : FlatBuilder < ' a > > FlatSerialize < ' a , B > for HostnameRule {
37+ impl < ' a > FlatSerialize < ' a , EngineFlatBuilder < ' a > > for HostnameRule {
3738 type Output = WIPOffset < fb:: HostnameSpecificRules < ' a > > ;
3839
3940 fn serialize (
4041 value : Self ,
41- builder : & mut B ,
42+ builder : & mut EngineFlatBuilder < ' a > ,
4243 ) -> flatbuffers:: WIPOffset < fb:: HostnameSpecificRules < ' a > > {
4344 let unhide = serialize_vec_opt ( value. unhide , builder) ;
4445 let uninject_script = serialize_vec_opt ( value. uninject_script , builder) ;
@@ -69,29 +70,29 @@ pub(crate) struct CosmeticFilterCacheBuilder {
6970 complex_class_rules : HashMapBuilder < String , StringVector > ,
7071 complex_id_rules : HashMapBuilder < String , StringVector > ,
7172
72- hostname_hide : FlatMultiMapBuilder < Hash , String > ,
73- hostname_inject_script : FlatMultiMapBuilder < Hash , String > ,
73+ hostname_hide : FlatMultiMapBuilder < Hash , ShareableString > ,
74+ hostname_inject_script : FlatMultiMapBuilder < Hash , ShareableString > ,
7475
7576 specific_rules : HashMap < Hash , HostnameRule > ,
7677}
7778
7879impl CosmeticFilterCacheBuilder {
79- pub fn from_rules ( rules : Vec < CosmeticFilter > ) -> Self {
80+ pub fn from_rules ( rules : Vec < CosmeticFilter > , builder : & mut EngineFlatBuilder ) -> Self {
8081 let mut self_ = Self :: default ( ) ;
8182
8283 for rule in rules {
83- self_. add_filter ( rule)
84+ self_. add_filter ( rule, builder ) ;
8485 }
8586
8687 self_
8788 }
8889
89- pub fn add_filter ( & mut self , rule : CosmeticFilter ) {
90+ pub fn add_filter ( & mut self , rule : CosmeticFilter , builder : & mut EngineFlatBuilder ) {
9091 if rule. has_hostname_constraint ( ) {
9192 if let Some ( generic_rule) = rule. hidden_generic_rule ( ) {
9293 self . add_generic_filter ( generic_rule) ;
9394 }
94- self . store_hostname_rule ( rule) ;
95+ self . store_hostname_rule ( rule, builder ) ;
9596 } else {
9697 self . add_generic_filter ( rule) ;
9798 }
@@ -139,7 +140,7 @@ impl CosmeticFilterCacheBuilder {
139140 }
140141 }
141142
142- fn store_hostname_rule ( & mut self , rule : CosmeticFilter ) {
143+ fn store_hostname_rule ( & mut self , rule : CosmeticFilter , builder : & mut EngineFlatBuilder ) {
143144 use SpecificFilterType :: * ;
144145
145146 let unhide = rule. mask . contains ( CosmeticFilterMask :: UNHIDE ) ;
@@ -171,45 +172,74 @@ impl CosmeticFilterCacheBuilder {
171172 . chain ( rule. hostnames . unwrap_or_default ( ) )
172173 . chain ( rule. entities . unwrap_or_default ( ) ) ;
173174
174- tokens_to_insert . for_each ( |t| self . store_hostname_filter ( & t , kind. clone ( ) ) ) ;
175+ self . store_hostname_filter ( tokens_to_insert , & kind, builder ) ;
175176
177+ let negated = kind. negated ( ) ;
176178 let tokens_to_insert_negated = std:: iter:: empty ( )
177179 . chain ( rule. not_hostnames . unwrap_or_default ( ) )
178180 . chain ( rule. not_entities . unwrap_or_default ( ) ) ;
179181
180- let negated = kind. negated ( ) ;
181-
182- tokens_to_insert_negated. for_each ( |t| self . store_hostname_filter ( & t, negated. clone ( ) ) ) ;
182+ self . store_hostname_filter ( tokens_to_insert_negated, & negated, builder) ;
183183 }
184184
185- fn store_hostname_filter ( & mut self , token : & Hash , kind : SpecificFilterType ) {
185+ fn store_hostname_filter (
186+ & mut self ,
187+ tokens : impl IntoIterator < Item = Hash > ,
188+ kind : & SpecificFilterType ,
189+ builder : & mut EngineFlatBuilder ,
190+ ) {
186191 use SpecificFilterType :: * ;
187192
188193 match kind {
189194 // Handle hide and inject_script at top level for better deduplication
190195 Hide ( s) => {
191- self . hostname_hide . insert ( * token, s) ;
196+ let mut shareable_string = None ;
197+ for token in tokens {
198+ let s = shareable_string. get_or_insert_with ( || builder. add_shareable_string ( s) ) ;
199+ self . hostname_hide . insert ( token, s. clone ( ) ) ;
200+ }
192201 }
193202 InjectScript ( ( s, permission) ) => {
194- let encoded_script = encode_script_with_permission ( s, permission) ;
195- self . hostname_inject_script . insert ( * token, encoded_script) ;
203+ let mut shareable_string = None ;
204+ for token in tokens {
205+ let s = shareable_string. get_or_insert_with ( || {
206+ builder. add_shareable_string ( & encode_script_with_permission ( s, permission) )
207+ } ) ;
208+ self . hostname_inject_script . insert ( token, s. clone ( ) ) ;
209+ }
196210 }
197211 // Handle remaining types through HostnameRule
198212 Unhide ( s) => {
199- let entry = self . specific_rules . entry ( * token) . or_default ( ) ;
200- entry. unhide . push ( s) ;
213+ let mut shareable_string = None ;
214+ for token in tokens {
215+ let s = shareable_string. get_or_insert_with ( || builder. add_shareable_string ( s) ) ;
216+ let entry = self . specific_rules . entry ( token) . or_default ( ) ;
217+ entry. unhide . push ( s. clone ( ) ) ;
218+ }
201219 }
202220 UninjectScript ( ( s, _) ) => {
203- let entry = self . specific_rules . entry ( * token) . or_default ( ) ;
204- entry. uninject_script . push ( s) ;
221+ let mut shareable_string = None ;
222+ for token in tokens {
223+ let s = shareable_string. get_or_insert_with ( || builder. add_shareable_string ( s) ) ;
224+ let entry = self . specific_rules . entry ( token) . or_default ( ) ;
225+ entry. uninject_script . push ( s. clone ( ) ) ;
226+ }
205227 }
206228 ProceduralOrAction ( s) => {
207- let entry = self . specific_rules . entry ( * token) . or_default ( ) ;
208- entry. procedural_action . push ( s) ;
229+ let mut shareable_string = None ;
230+ for token in tokens {
231+ let s = shareable_string. get_or_insert_with ( || builder. add_shareable_string ( s) ) ;
232+ let entry = self . specific_rules . entry ( token) . or_default ( ) ;
233+ entry. procedural_action . push ( s. clone ( ) ) ;
234+ }
209235 }
210236 ProceduralOrActionException ( s) => {
211- let entry = self . specific_rules . entry ( * token) . or_default ( ) ;
212- entry. procedural_action_exception . push ( s) ;
237+ let mut shareable_string = None ;
238+ for token in tokens {
239+ let s = shareable_string. get_or_insert_with ( || builder. add_shareable_string ( s) ) ;
240+ let entry = self . specific_rules . entry ( token) . or_default ( ) ;
241+ entry. procedural_action_exception . push ( s. clone ( ) ) ;
242+ }
213243 }
214244 }
215245 }
@@ -227,10 +257,13 @@ impl<'a, B: FlatBuilder<'a>> FlatSerialize<'a, B> for StringVector {
227257 }
228258}
229259
230- impl < ' a , B : FlatBuilder < ' a > > FlatSerialize < ' a , B > for CosmeticFilterCacheBuilder {
260+ impl < ' a > FlatSerialize < ' a , EngineFlatBuilder < ' a > > for CosmeticFilterCacheBuilder {
231261 type Output = WIPOffset < fb:: CosmeticFilters < ' a > > ;
232262
233- fn serialize ( value : Self , builder : & mut B ) -> WIPOffset < fb:: CosmeticFilters < ' a > > {
263+ fn serialize (
264+ value : Self ,
265+ builder : & mut EngineFlatBuilder < ' a > ,
266+ ) -> WIPOffset < fb:: CosmeticFilters < ' a > > {
234267 let complex_class_rules = HashMapBuilder :: finish ( value. complex_class_rules , builder) ;
235268 let complex_id_rules = HashMapBuilder :: finish ( value. complex_id_rules , builder) ;
236269
0 commit comments