22
33( function ( exports ) {
44
5- const util = require ( './util' ) ;
5+ const util = require ( './util' ) ,
6+ wasm = require ( './wasm' ) ;
67
78let settings = {
89 enableMixedRulesets : false ,
@@ -220,6 +221,11 @@ RuleSets.prototype = {
220221 loadFromBrowserStorage : async function ( store , applyStoredFunc ) {
221222 this . store = store ;
222223 this . ruleActiveStates = await this . store . get_promise ( 'ruleActiveStates' , { } ) ;
224+ try {
225+ this . wasm_rs = wasm . RuleSets . new ( ) ;
226+ } catch ( e ) {
227+ util . log ( util . WARN , 'Falling back to pure JS implementation: ' + e ) ;
228+ }
223229 await applyStoredFunc ( this ) ;
224230 await this . loadStoredUserRules ( ) ;
225231 await this . addStoredCustomRulesets ( ) ;
@@ -241,11 +247,20 @@ RuleSets.prototype = {
241247
242248 addFromJson : function ( ruleJson , scope ) {
243249 const scope_obj = getScope ( scope ) ;
244- for ( let ruleset of ruleJson ) {
245- try {
246- this . parseOneJsonRuleset ( ruleset , scope_obj ) ;
247- } catch ( e ) {
248- util . log ( util . WARN , 'Error processing ruleset:' + e ) ;
250+
251+ if ( this . wasm_rs ) {
252+ this . wasm_rs . add_all_from_js_array (
253+ ruleJson ,
254+ settings . enableMixedRulesets ,
255+ this . ruleActiveStates ,
256+ scope ) ;
257+ } else {
258+ for ( let ruleset of ruleJson ) {
259+ try {
260+ this . parseOneJsonRuleset ( ruleset , scope_obj ) ;
261+ } catch ( e ) {
262+ util . log ( util . WARN , 'Error processing ruleset:' + e ) ;
263+ }
249264 }
250265 }
251266 } ,
@@ -322,7 +337,15 @@ RuleSets.prototype = {
322337 */
323338 addUserRule : function ( params , scope ) {
324339 util . log ( util . INFO , 'adding new user rule for ' + JSON . stringify ( params ) ) ;
325- this . parseOneJsonRuleset ( params , scope ) ;
340+ if ( this . wasm_rs ) {
341+ this . wasm_rs . add_all_from_js_array (
342+ [ params ] ,
343+ settings . enableMixedRulesets ,
344+ this . ruleActiveStates ,
345+ scope ) ;
346+ } else {
347+ this . parseOneJsonRuleset ( params , scope ) ;
348+ }
326349
327350 // clear cache so new rule take effect immediately
328351 for ( const target of params . target ) {
@@ -351,11 +374,16 @@ RuleSets.prototype = {
351374 this . ruleCache . delete ( ruleset . name ) ;
352375
353376 if ( src === 'popup' ) {
354- const tmp = this . targets . get ( ruleset . name ) . filter ( r => ! r . isEquivalentTo ( ruleset ) )
355- this . targets . set ( ruleset . name , tmp ) ;
356377
357- if ( this . targets . get ( ruleset . name ) . length == 0 ) {
358- this . targets . delete ( ruleset . name ) ;
378+ if ( this . wasm_rs ) {
379+ this . wasm_rs . remove_ruleset ( ruleset ) ;
380+ } else {
381+ const tmp = this . targets . get ( ruleset . name ) . filter ( r => ! r . isEquivalentTo ( ruleset ) )
382+ this . targets . set ( ruleset . name , tmp ) ;
383+
384+ if ( this . targets . get ( ruleset . name ) . length == 0 ) {
385+ this . targets . delete ( ruleset . name ) ;
386+ }
359387 }
360388 }
361389
@@ -546,51 +574,80 @@ RuleSets.prototype = {
546574 util . log ( util . DBUG , "Ruleset cache miss for " + host ) ;
547575 }
548576
549- // Let's begin search
550- // Copy the host targets so we don't modify them.
551- let results = ( this . targets . has ( host ) ?
552- new Set ( [ ...this . targets . get ( host ) ] ) :
553- new Set ( ) ) ;
577+ let results ;
578+ if ( this . wasm_rs ) {
579+ let pa = this . wasm_rs . potentially_applicable ( host ) ;
580+ results = new Set ( [ ...pa ] . map ( ruleset => {
581+ let rs = new RuleSet ( ruleset . name , ruleset . default_state , getScope ( ruleset . scope ) , ruleset . note ) ;
554582
555- // Ensure host is well-formed (RFC 1035)
556- if ( host . length <= 0 || host . length > 255 || host . indexOf ( ".." ) != - 1 ) {
557- util . log ( util . WARN , "Malformed host passed to potentiallyApplicableRulesets: " + host ) ;
558- return nullIterable ;
559- }
583+ if ( ruleset . cookierules ) {
584+ let cookierules = ruleset . cookierules . map ( cookierule => {
585+ return new CookieRule ( cookierule . host , cookierule . name ) ;
586+ } ) ;
587+ rs . cookierules = cookierules ;
588+ } else {
589+ rs . cookierules = null ;
590+ }
560591
561- // Replace www.example.com with www.example.*
562- // eat away from the right for once and only once
563- let segmented = host . split ( "." ) ;
564- if ( segmented . length > 1 ) {
565- const tmp = segmented [ segmented . length - 1 ] ;
566- segmented [ segmented . length - 1 ] = "*" ;
592+ let rules = ruleset . rules . map ( rule => {
593+ return getRule ( rule . from , rule . to ) ;
594+ } ) ;
595+ rs . rules = rules ;
567596
568- results = ( this . targets . has ( segmented . join ( "." ) ) ?
569- new Set ( [ ...results , ...this . targets . get ( segmented . join ( "." ) ) ] ) :
570- results ) ;
597+ if ( ruleset . exclusions ) {
598+ rs . exclusions = new RegExp ( ruleset . exclusions ) ;
599+ } else {
600+ rs . exclusions = null ;
601+ }
602+ return rs ;
603+ } ) ) ;
604+ } else {
605+ // Let's begin search
606+ // Copy the host targets so we don't modify them.
607+ results = ( this . targets . has ( host ) ?
608+ new Set ( [ ...this . targets . get ( host ) ] ) :
609+ new Set ( ) ) ;
610+
611+ // Ensure host is well-formed (RFC 1035)
612+ if ( host . length <= 0 || host . length > 255 || host . indexOf ( ".." ) != - 1 ) {
613+ util . log ( util . WARN , "Malformed host passed to potentiallyApplicableRulesets: " + host ) ;
614+ return nullIterable ;
615+ }
571616
572- segmented [ segmented . length - 1 ] = tmp ;
573- }
617+ // Replace www.example.com with www.example.*
618+ // eat away from the right for once and only once
619+ let segmented = host . split ( "." ) ;
620+ if ( segmented . length > 1 ) {
621+ const tmp = segmented [ segmented . length - 1 ] ;
622+ segmented [ segmented . length - 1 ] = "*" ;
574623
575- // now eat away from the left, with *, so that for x.y.z.google.com we
576- // check *.y.z.google.com, *.z.google.com and *.google.com
577- for ( let i = 1 ; i <= segmented . length - 2 ; i ++ ) {
578- let t = "*." + segmented . slice ( i , segmented . length ) . join ( "." ) ;
624+ results = ( this . targets . has ( segmented . join ( "." ) ) ?
625+ new Set ( [ ...results , ...this . targets . get ( segmented . join ( "." ) ) ] ) :
626+ results ) ;
579627
580- results = ( this . targets . has ( t ) ?
581- new Set ( [ ...results , ...this . targets . get ( t ) ] ) :
582- results ) ;
583- }
628+ segmented [ segmented . length - 1 ] = tmp ;
629+ }
584630
585- // Clean the results list, which may contain duplicates or undefined entries
586- results . delete ( undefined ) ;
631+ // now eat away from the left, with *, so that for x.y.z.google.com we
632+ // check *.y.z.google.com, *.z.google.com and *.google.com
633+ for ( let i = 1 ; i <= segmented . length - 2 ; i ++ ) {
634+ let t = "*." + segmented . slice ( i , segmented . length ) . join ( "." ) ;
587635
588- util . log ( util . DBUG , "Applicable rules for " + host + ":" ) ;
589- if ( results . size == 0 ) {
590- util . log ( util . DBUG , " None" ) ;
591- results = nullIterable ;
592- } else {
593- results . forEach ( result => util . log ( util . DBUG , " " + result . name ) ) ;
636+ results = ( this . targets . has ( t ) ?
637+ new Set ( [ ...results , ...this . targets . get ( t ) ] ) :
638+ results ) ;
639+ }
640+
641+ // Clean the results list, which may contain duplicates or undefined entries
642+ results . delete ( undefined ) ;
643+
644+ util . log ( util . DBUG , "Applicable rules for " + host + ":" ) ;
645+ if ( results . size == 0 ) {
646+ util . log ( util . DBUG , " None" ) ;
647+ results = nullIterable ;
648+ } else {
649+ results . forEach ( result => util . log ( util . DBUG , " " + result . name ) ) ;
650+ }
594651 }
595652
596653 // Insert results into the ruleset cache
0 commit comments