1616 */
1717
1818import { extractHostFromURL , getBaseDomain } from "../lib/basedomain.js" ;
19+ import { Trie } from "../lib/trie.js" ;
1920
2021import { log } from "./bootstrap.js" ;
2122import constants from "./constants.js" ;
@@ -106,6 +107,8 @@ function Badger(from_qunit) {
106107 async function onStorageReady ( ) {
107108 log ( "Storage is ready" ) ;
108109
110+ self . initDisabledSitesTrie ( ) ;
111+
109112 self . heuristicBlocking = new HeuristicBlocking . HeuristicBlocker ( self . storage ) ;
110113
111114 self . setPrivacyOverrides ( ) ;
@@ -176,6 +179,11 @@ Badger.prototype = {
176179 */
177180 cnameDomains : { } ,
178181
182+ /**
183+ * Trie for looking up whether PB is disabled for a site.
184+ */
185+ disabledSitesTrie : null ,
186+
179187 // Methods
180188
181189 /**
@@ -1013,6 +1021,27 @@ Badger.prototype = {
10131021 return this . storage . getStore ( 'private_storage' ) ;
10141022 } ,
10151023
1024+ /**
1025+ * (Re)builds the disabled sites trie.
1026+ */
1027+ initDisabledSitesTrie : function ( ) {
1028+ let self = this ;
1029+
1030+ self . disabledSitesTrie = new Trie ( ) ;
1031+
1032+ for ( let pattern of self . getSettings ( ) . getItem ( "disabledSites" ) ) {
1033+ // domains now always match subdomains
1034+ // TODO clean up user data and remove wildcard handling
1035+ if ( pattern . startsWith ( '*' ) ) {
1036+ pattern = pattern . slice ( 1 ) ;
1037+ if ( pattern . startsWith ( '.' ) ) {
1038+ pattern = pattern . slice ( 1 ) ;
1039+ }
1040+ }
1041+ self . disabledSitesTrie . insert ( pattern ) ;
1042+ }
1043+ } ,
1044+
10161045 /**
10171046 * Returns whether Privacy Badger is enabled on a given hostname.
10181047 *
@@ -1021,23 +1050,51 @@ Badger.prototype = {
10211050 * @returns {Boolean }
10221051 */
10231052 isPrivacyBadgerEnabled : function ( host ) {
1024- let sitePatterns = this . getSettings ( ) . getItem ( "disabledSites" ) || [ ] ;
1053+ return ! this . disabledSitesTrie . globDomainMatches ( host ) ;
1054+ } ,
1055+
1056+ /**
1057+ * Adds a domain to the list of disabled sites.
1058+ *
1059+ * @param {String } domain The site domain to disable PB for
1060+ */
1061+ disableOnSite : function ( domain ) {
1062+ let self = this ,
1063+ settings = self . getSettings ( ) ,
1064+ disabledSites = settings . getItem ( 'disabledSites' ) ;
1065+
1066+ if ( ! disabledSites . includes ( domain ) ) {
1067+ disabledSites . push ( domain ) ;
1068+ settings . setItem ( "disabledSites" , disabledSites ) ;
10251069
1026- for ( let pattern of sitePatterns ) {
10271070 // domains now always match subdomains
10281071 // TODO clean up user data and remove wildcard handling
1029- if ( pattern . startsWith ( '*' ) ) {
1030- pattern = pattern . slice ( 1 ) ;
1031- if ( pattern . startsWith ( '.' ) ) {
1032- pattern = pattern . slice ( 1 ) ;
1072+ if ( domain . startsWith ( '*' ) ) {
1073+ domain = domain . slice ( 1 ) ;
1074+ if ( domain . startsWith ( '.' ) ) {
1075+ domain = domain . slice ( 1 ) ;
10331076 }
10341077 }
1035- if ( pattern === host || host . endsWith ( '.' + pattern ) ) {
1036- return false ;
1037- }
1078+ self . disabledSitesTrie . insert ( domain ) ;
10381079 }
1080+ } ,
10391081
1040- return true ;
1082+ /**
1083+ * Removes a domain from the list of disabled sites.
1084+ *
1085+ * @param {String } domain The site domain to re-enable PB on
1086+ */
1087+ reenableOnSite : function ( domain ) {
1088+ let self = this ,
1089+ settings = self . getSettings ( ) ,
1090+ disabledSites = settings . getItem ( "disabledSites" ) ,
1091+ idx = disabledSites . indexOf ( domain ) ;
1092+
1093+ if ( idx >= 0 ) {
1094+ disabledSites . splice ( idx , 1 ) ;
1095+ settings . setItem ( "disabledSites" , disabledSites ) ;
1096+ self . initDisabledSitesTrie ( ) ;
1097+ }
10411098 } ,
10421099
10431100 /**
@@ -1075,44 +1132,6 @@ Badger.prototype = {
10751132 return this . getSettings ( ) . getItem ( "checkForDNTPolicy" ) ;
10761133 } ,
10771134
1078- /**
1079- * Adds a domain to the list of disabled sites.
1080- *
1081- * @param {String } domain The site domain to disable PB for
1082- */
1083- disableOnSite : function ( domain ) {
1084- let settings = this . getSettings ( ) ;
1085- let disabledSites = settings . getItem ( 'disabledSites' ) ;
1086- if ( disabledSites . indexOf ( domain ) < 0 ) {
1087- disabledSites . push ( domain ) ;
1088- settings . setItem ( "disabledSites" , disabledSites ) ;
1089- }
1090- } ,
1091-
1092- /**
1093- * Returns the current list of disabled sites.
1094- *
1095- * @returns {Array } site domains where Privacy Badger is disabled
1096- */
1097- getDisabledSites : function ( ) {
1098- return this . getSettings ( ) . getItem ( "disabledSites" ) ;
1099- } ,
1100-
1101- /**
1102- * Removes a domain from the list of disabled sites.
1103- *
1104- * @param {String } domain The site domain to re-enable PB on
1105- */
1106- reenableOnSite : function ( domain ) {
1107- let settings = this . getSettings ( ) ;
1108- let disabledSites = settings . getItem ( "disabledSites" ) ;
1109- let idx = disabledSites . indexOf ( domain ) ;
1110- if ( idx >= 0 ) {
1111- disabledSites . splice ( idx , 1 ) ;
1112- settings . setItem ( "disabledSites" , disabledSites ) ;
1113- }
1114- } ,
1115-
11161135 /**
11171136 * Checks if local storage ( in dict) has any high-entropy keys
11181137 *
0 commit comments