From da6d17c159faa624f2ea170b6e4e8d8b86d7b7f8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Oct 2022 11:13:27 -0400 Subject: [PATCH] [mv3] Add support for aeld scriptlet --- .../mv3/scriptlets/no-addeventlistener-if.js | 119 ++++++++++++++++++ platform/mv3/scriptlets/no-setinterval-if.js | 3 +- platform/mv3/scriptlets/no-settimeout-if.js | 3 +- platform/mv3/scriptlets/no-windowopen-if.js | 1 - 4 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 platform/mv3/scriptlets/no-addeventlistener-if.js diff --git a/platform/mv3/scriptlets/no-addeventlistener-if.js b/platform/mv3/scriptlets/no-addeventlistener-if.js new file mode 100644 index 000000000..bdf9b5a5e --- /dev/null +++ b/platform/mv3/scriptlets/no-addeventlistener-if.js @@ -0,0 +1,119 @@ +/******************************************************************************* + + uBlock Origin - a browser extension to block requests. + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +/* jshint esversion:11 */ + +'use strict'; + +/******************************************************************************/ + +/// name no-addEventListener-if +/// alias noaelif +/// alias aeld + +/******************************************************************************/ + +// Important! +// Isolate from global scope +(function uBOL_noAddEventListenerIf() { + +/******************************************************************************/ + +// $rulesetId$ + +const argsMap = new Map(self.$argsMap$); + +const hostnamesMap = new Map(self.$hostnamesMap$); + +/******************************************************************************/ + +const regexpFromArg = arg => { + if ( arg === '' ) { return /^/; } + if ( /^\/.+\/$/.test(arg) ) { return new RegExp(arg.slice(1,-1)); } + return new RegExp(arg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); +}; + +/******************************************************************************/ + +const scriptlet = ( + needle1 = '', + needle2 = '' +) => { + const reNeedle1 = regexpFromArg(needle1); + const reNeedle2 = regexpFromArg(needle2); + self.EventTarget.prototype.addEventListener = new Proxy( + self.EventTarget.prototype.addEventListener, + { + apply: function(target, thisArg, args) { + let type, handler; + try { + type = String(args[0]); + handler = String(args[1]); + } catch(ex) { + } + if ( + reNeedle1.test(type) === false || + reNeedle2.test(handler) === false + ) { + return target.apply(thisArg, args); + } + } + } + ); +}; + +/******************************************************************************/ + +let hn; +try { hn = document.location.hostname; } catch(ex) { } +while ( hn ) { + if ( hostnamesMap.has(hn) ) { + let argsHashes = hostnamesMap.get(hn); + if ( typeof argsHashes === 'number' ) { argsHashes = [ argsHashes ]; } + for ( const argsHash of argsHashes ) { + const details = argsMap.get(argsHash); + if ( details.n && details.n.includes(hn) ) { continue; } + try { scriptlet(...details.a); } catch(ex) {} + } + } + if ( hn === '*' ) { break; } + const pos = hn.indexOf('.'); + if ( pos !== -1 ) { + hn = hn.slice(pos + 1); + } else { + hn = '*'; + } +} + +/******************************************************************************/ + +argsMap.clear(); +hostnamesMap.clear(); + +/******************************************************************************/ + +})(); + +/******************************************************************************/ + diff --git a/platform/mv3/scriptlets/no-setinterval-if.js b/platform/mv3/scriptlets/no-setinterval-if.js index 32e9bb20a..ec2525ed2 100644 --- a/platform/mv3/scriptlets/no-setinterval-if.js +++ b/platform/mv3/scriptlets/no-setinterval-if.js @@ -49,8 +49,7 @@ const hostnamesMap = new Map(self.$hostnamesMap$); const scriptlet = ( needle = '', - delay = '', - + delay = '' ) => { const needleNot = needle.charAt(0) === '!'; if ( needleNot ) { needle = needle.slice(1); } diff --git a/platform/mv3/scriptlets/no-settimeout-if.js b/platform/mv3/scriptlets/no-settimeout-if.js index b8078a578..4a789d44d 100644 --- a/platform/mv3/scriptlets/no-settimeout-if.js +++ b/platform/mv3/scriptlets/no-settimeout-if.js @@ -49,8 +49,7 @@ const hostnamesMap = new Map(self.$hostnamesMap$); const scriptlet = ( needle = '', - delay = '', - + delay = '' ) => { const needleNot = needle.charAt(0) === '!'; if ( needleNot ) { needle = needle.slice(1); } diff --git a/platform/mv3/scriptlets/no-windowopen-if.js b/platform/mv3/scriptlets/no-windowopen-if.js index d3ed3417b..051afebb0 100644 --- a/platform/mv3/scriptlets/no-windowopen-if.js +++ b/platform/mv3/scriptlets/no-windowopen-if.js @@ -51,7 +51,6 @@ const scriptlet = ( needle = '', delay = '', options = '' - ) => { const newSyntax = /^[01]?$/.test(needle) === false; let pattern = '';