Skip to content

Commit 8f3d8cd

Browse files
committed
Add support to compare delay against literal Number.NaN in nossif/nostif
Related issue: - uBlockOrigin/uBlock-issues#1136
1 parent dd6f41a commit 8f3d8cd

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

assets/resources/scriptlets.js

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -705,37 +705,41 @@
705705
const needleNot = needle.charAt(0) === '!';
706706
if ( needleNot ) { needle = needle.slice(1); }
707707
let delay = '{{2}}';
708-
const delayNot = delay.charAt(0) === '!';
709-
if ( delayNot ) { delay = delay.slice(1); }
710-
delay = parseInt(delay, 10);
708+
if ( delay === '{{2}}' ) { delay = undefined; }
709+
let delayNot = false;
710+
if ( delay !== undefined ) {
711+
delayNot = delay.charAt(0) === '!';
712+
if ( delayNot ) { delay = delay.slice(1); }
713+
delay = parseInt(delay, 10);
714+
}
711715
if ( needle === '' || needle === '{{1}}' ) {
712716
needle = '';
713717
} else if ( needle.startsWith('/') && needle.endsWith('/') ) {
714718
needle = needle.slice(1,-1);
715719
} else {
716720
needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
717721
}
718-
const log = needleNot === false && needle === '' &&
719-
delayNot === false && isNaN(delay)
722+
const log = needleNot === false && needle === '' && delay === undefined
720723
? console.log
721724
: undefined;
722725
const reNeedle = new RegExp(needle);
723726
window.setInterval = new Proxy(window.setInterval, {
724727
apply: function(target, thisArg, args) {
725728
const a = String(args[0]);
726729
const b = args[1];
727-
let defuse = false;
728730
if ( log !== undefined ) {
729731
log('uBO: setInterval("%s", %s)', a, b);
730-
} else if ( isNaN(delay) ) {
731-
defuse = reNeedle.test(a) !== needleNot;
732-
} else if ( needle === '' ) {
733-
defuse = (b === delay) !== delayNot;
734732
} else {
735-
defuse = reNeedle.test(a) !== needleNot && (b === delay) !== delayNot;
736-
}
737-
if ( defuse ) {
738-
args[0] = function(){};
733+
let defuse;
734+
if ( needle !== '' ) {
735+
defuse = reNeedle.test(a) !== needleNot;
736+
}
737+
if ( defuse !== false && delay !== undefined ) {
738+
defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot;
739+
}
740+
if ( defuse ) {
741+
args[0] = function(){};
742+
}
739743
}
740744
return target.apply(thisArg, args);
741745
}
@@ -776,37 +780,41 @@
776780
const needleNot = needle.charAt(0) === '!';
777781
if ( needleNot ) { needle = needle.slice(1); }
778782
let delay = '{{2}}';
779-
const delayNot = delay.charAt(0) === '!';
780-
if ( delayNot ) { delay = delay.slice(1); }
781-
delay = parseInt(delay, 10);
783+
if ( delay === '{{2}}' ) { delay = undefined; }
784+
let delayNot = false;
785+
if ( delay !== undefined ) {
786+
delayNot = delay.charAt(0) === '!';
787+
if ( delayNot ) { delay = delay.slice(1); }
788+
delay = parseInt(delay, 10);
789+
}
782790
if ( needle === '' || needle === '{{1}}' ) {
783791
needle = '';
784792
} else if ( needle.startsWith('/') && needle.endsWith('/') ) {
785793
needle = needle.slice(1,-1);
786794
} else {
787795
needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
788796
}
789-
const log = needleNot === false && needle === '' &&
790-
delayNot === false && isNaN(delay)
797+
const log = needleNot === false && needle === '' && delay === undefined
791798
? console.log
792799
: undefined;
793800
const reNeedle = new RegExp(needle);
794801
window.setTimeout = new Proxy(window.setTimeout, {
795802
apply: function(target, thisArg, args) {
796803
const a = String(args[0]);
797804
const b = args[1];
798-
let defuse = false;
799805
if ( log !== undefined ) {
800806
log('uBO: setTimeout("%s", %s)', a, b);
801-
} else if ( isNaN(delay) ) {
802-
defuse = reNeedle.test(a) !== needleNot;
803-
} else if ( needle === '' ) {
804-
defuse = (b === delay) !== delayNot;
805807
} else {
806-
defuse = reNeedle.test(a) !== needleNot && (b === delay) !== delayNot;
807-
}
808-
if ( defuse ) {
809-
args[0] = function(){};
808+
let defuse;
809+
if ( needle !== '' ) {
810+
defuse = reNeedle.test(a) !== needleNot;
811+
}
812+
if ( defuse !== false && delay !== undefined ) {
813+
defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot;
814+
}
815+
if ( defuse ) {
816+
args[0] = function(){};
817+
}
810818
}
811819
return target.apply(thisArg, args);
812820
}

0 commit comments

Comments
 (0)