From fc84fdee5291a429fecbcbfbb459433941ad6075 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 14 Mar 2023 08:21:22 -0400 Subject: [PATCH] Fine tune scriptlet --- assets/resources/scriptlets.js | 42 +++++++++++++++++-- .../mv3/scriptlets/set-constant.entity.js | 41 ++++++++++++++++-- platform/mv3/scriptlets/set-constant.js | 41 ++++++++++++++++-- 3 files changed, 112 insertions(+), 12 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 1139adfec..4e7bbe17b 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -904,8 +904,42 @@ /// alias set.js (function() { const chain = '{{1}}'; + if ( chain === '{{1}}' || chain === '' ) { return; } let cValue = '{{2}}'; + const trappedProp = (( ) => { + const pos = chain.lastIndexOf('.'); + if ( pos === -1 ) { return chain; } + return chain.slice(pos+1); + })(); + if ( trappedProp === '' ) { return; } const thisScript = document.currentScript; + const objectDefineProperty = Object.defineProperty.bind(Object); + const cloakFunc = fn => { + objectDefineProperty(fn, 'name', { value: trappedProp }); + const proxy = new Proxy(fn, { + defineProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + deleteProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + get(target, prop) { + if ( prop === 'toString' ) { + return function() { + return `function ${trappedProp}() { [native code] }`; + }.bind(null); + } + return Reflect.get(...arguments); + }, + }); + return proxy; + }; if ( cValue === 'undefined' ) { cValue = undefined; } else if ( cValue === 'false' ) { @@ -921,11 +955,11 @@ } else if ( cValue === '{}' ) { cValue = {}; } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; + cValue = cloakFunc(function(){}); } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; + cValue = cloakFunc(function(){ return true; }); } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; + cValue = cloakFunc(function(){ return false; }); } else if ( /^\d+$/.test(cValue) ) { cValue = parseFloat(cValue); if ( isNaN(cValue) ) { return; } @@ -958,7 +992,7 @@ } } try { - Object.defineProperty(owner, prop, { + objectDefineProperty(owner, prop, { configurable, get() { if ( prevGetter !== undefined ) { diff --git a/platform/mv3/scriptlets/set-constant.entity.js b/platform/mv3/scriptlets/set-constant.entity.js index 8aa41c44c..d758ef7f7 100644 --- a/platform/mv3/scriptlets/set-constant.entity.js +++ b/platform/mv3/scriptlets/set-constant.entity.js @@ -52,6 +52,39 @@ const scriptlet = ( cValue = '' ) => { if ( chain === '' ) { return; } + const trappedProp = (( ) => { + const pos = chain.lastIndexOf('.'); + if ( pos === -1 ) { return chain; } + return chain.slice(pos+1); + })(); + if ( trappedProp === '' ) { return; } + const objectDefineProperty = Object.defineProperty.bind(Object); + const cloakFunc = fn => { + objectDefineProperty(fn, 'name', { value: trappedProp }); + const proxy = new Proxy(fn, { + defineProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + deleteProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + get(target, prop) { + if ( prop === 'toString' ) { + return function() { + return `function ${trappedProp}() { [native code] }`; + }.bind(null); + } + return Reflect.get(...arguments); + }, + }); + return proxy; + }; if ( cValue === 'undefined' ) { cValue = undefined; } else if ( cValue === 'false' ) { @@ -67,11 +100,11 @@ const scriptlet = ( } else if ( cValue === '{}' ) { cValue = {}; } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; + cValue = cloakFunc(function(){}); } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; + cValue = cloakFunc(function(){ return true; }); } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; + cValue = cloakFunc(function(){ return false; }); } else if ( /^\d+$/.test(cValue) ) { cValue = parseFloat(cValue); if ( isNaN(cValue) ) { return; } @@ -104,7 +137,7 @@ const scriptlet = ( } } try { - Object.defineProperty(owner, prop, { + objectDefineProperty(owner, prop, { configurable, get() { if ( prevGetter !== undefined ) { diff --git a/platform/mv3/scriptlets/set-constant.js b/platform/mv3/scriptlets/set-constant.js index 41ca3c471..dc714c844 100644 --- a/platform/mv3/scriptlets/set-constant.js +++ b/platform/mv3/scriptlets/set-constant.js @@ -52,6 +52,39 @@ const scriptlet = ( cValue = '' ) => { if ( chain === '' ) { return; } + const trappedProp = (( ) => { + const pos = chain.lastIndexOf('.'); + if ( pos === -1 ) { return chain; } + return chain.slice(pos+1); + })(); + if ( trappedProp === '' ) { return; } + const objectDefineProperty = Object.defineProperty.bind(Object); + const cloakFunc = fn => { + objectDefineProperty(fn, 'name', { value: trappedProp }); + const proxy = new Proxy(fn, { + defineProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + deleteProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + get(target, prop) { + if ( prop === 'toString' ) { + return function() { + return `function ${trappedProp}() { [native code] }`; + }.bind(null); + } + return Reflect.get(...arguments); + }, + }); + return proxy; + }; if ( cValue === 'undefined' ) { cValue = undefined; } else if ( cValue === 'false' ) { @@ -67,11 +100,11 @@ const scriptlet = ( } else if ( cValue === '{}' ) { cValue = {}; } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; + cValue = cloakFunc(function(){}); } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; + cValue = cloakFunc(function(){ return true; }); } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; + cValue = cloakFunc(function(){ return false; }); } else if ( /^\d+$/.test(cValue) ) { cValue = parseFloat(cValue); if ( isNaN(cValue) ) { return; } @@ -104,7 +137,7 @@ const scriptlet = ( } } try { - Object.defineProperty(owner, prop, { + objectDefineProperty(owner, prop, { configurable, get() { if ( prevGetter !== undefined ) {