Skip to content

Commit 10ae629

Browse files
committed
[mv3] Fix performance issue when importing large lists
Related discussion: https://www.reddit.com/r/uBlockOrigin/comments/1vos8cd/
1 parent 30de8a5 commit 10ae629

1 file changed

Lines changed: 20 additions & 17 deletions

File tree

platform/mv3/extension/js/ubo-parser.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,9 @@ function mergeDomains(rules, includeProp, excludeProp) {
142142
out.push(rule);
143143
continue;
144144
}
145-
const includes = new Set(rule.condition[includeProp]);
145+
const includes = rule.condition[includeProp] ?? [];
146146
rule.condition[includeProp] = undefined;
147-
const excludes = new Set(rule.condition[excludeProp]);
147+
const excludes = rule.condition[excludeProp] ?? [];
148148
rule.condition[excludeProp] = undefined;
149149
rule.id = undefined;
150150
const hash = JSON.stringify(rule, propertySorter);
@@ -153,31 +153,34 @@ function mergeDomains(rules, includeProp, excludeProp) {
153153
details.initialized = true;
154154
distinctRules.set(hash, details);
155155
}
156-
if ( includes.size === 0 ) {
157-
details.includes = includes;
156+
if ( includes.length === 0 ) {
157+
details.includes = [];
158158
} else if ( details.includes === undefined ) {
159159
details.includes = includes;
160-
} else if ( details.includes.size ) {
161-
details.includes = details.includes.union(includes);
160+
} else if ( details.includes.length ) {
161+
for ( const hn of includes ) {
162+
details.includes.push(hn);
163+
}
162164
}
163-
if ( excludes.size ) {
164-
details.excludes ??= new Set();
165-
details.excludes = details.excludes.union(excludes);
165+
if ( excludes.length ) {
166+
if ( details.excludes === undefined ) {
167+
details.excludes = excludes;
168+
} else {
169+
for ( const hn of excludes ) {
170+
details.excludes.push(hn);
171+
}
172+
}
166173
}
167174
}
168175
for ( const [ hash, details ] of distinctRules ) {
169176
const rule = JSON.parse(hash);
170177
rule.id = details.id;
171-
if ( details.includes?.size ) {
172-
rule.condition[includeProp] = Array.from(details.includes);
173-
}
174-
if ( details.excludes?.size ) {
175-
rule.condition[excludeProp] = Array.from(details.excludes);
176-
}
177-
if ( rule.condition[includeProp] ) {
178+
if ( details.includes?.length ) {
179+
rule.condition[includeProp] = Array.from(new Set(details.includes));
178180
rule.condition[includeProp].sort();
179181
}
180-
if ( rule.condition[excludeProp] ) {
182+
if ( details.excludes?.length ) {
183+
rule.condition[excludeProp] = Array.from(new Set(details.excludes));
181184
rule.condition[excludeProp].sort();
182185
}
183186
out.push(rule);

0 commit comments

Comments
 (0)