mirror of
https://github.com/gorhill/uBlock.git
synced 2024-10-06 09:37:12 +02:00
Add ability to execute aeld scriptlet at a later time
As per discussion with filter list maintainers. THis requires to use JSON notation for parameter passing: - "runAt": "end" = execute scriptlet at `DOMContentLoaded` event - "runAt": "idle" = execute scriptlet at `load` event
This commit is contained in:
parent
7cba521bc4
commit
3c12173dfe
@ -117,6 +117,35 @@ function shouldLog(details) {
|
|||||||
return scriptletGlobals.has('canDebug') && details.log;
|
return scriptletGlobals.has('canDebug') && details.log;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
builtinScriptlets.push({
|
||||||
|
name: 'run-at.fn',
|
||||||
|
fn: runAt,
|
||||||
|
});
|
||||||
|
function runAt(fn, when) {
|
||||||
|
const intFromReadyState = state => {
|
||||||
|
return ({
|
||||||
|
loading: 1,
|
||||||
|
interactive: 2,
|
||||||
|
end: 2,
|
||||||
|
complete: 3,
|
||||||
|
idle: 3,
|
||||||
|
})[`${state}`] || 0;
|
||||||
|
};
|
||||||
|
const runAt = intFromReadyState(when);
|
||||||
|
if ( intFromReadyState(document.readyState) >= runAt ) {
|
||||||
|
fn(); return;
|
||||||
|
}
|
||||||
|
const options = { capture: true };
|
||||||
|
const onStateChange = ( ) => {
|
||||||
|
if ( intFromReadyState(document.readyState) < runAt ) { return; }
|
||||||
|
fn();
|
||||||
|
document.removeEventListener('readystatechange', onStateChange, options);
|
||||||
|
};
|
||||||
|
document.addEventListener('readystatechange', onStateChange, options);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
||||||
Injectable scriptlets
|
Injectable scriptlets
|
||||||
@ -432,6 +461,7 @@ builtinScriptlets.push({
|
|||||||
fn: addEventListenerDefuser,
|
fn: addEventListenerDefuser,
|
||||||
dependencies: [
|
dependencies: [
|
||||||
'pattern-to-regex.fn',
|
'pattern-to-regex.fn',
|
||||||
|
'run-at.fn',
|
||||||
'safe-self.fn',
|
'safe-self.fn',
|
||||||
'should-debug.fn',
|
'should-debug.fn',
|
||||||
'should-log.fn',
|
'should-log.fn',
|
||||||
@ -453,8 +483,8 @@ function addEventListenerDefuser(
|
|||||||
const rePattern = patternToRegex(pattern);
|
const rePattern = patternToRegex(pattern);
|
||||||
const log = shouldLog(details);
|
const log = shouldLog(details);
|
||||||
const debug = shouldDebug(details);
|
const debug = shouldDebug(details);
|
||||||
const proto = self.EventTarget.prototype;
|
const trapEddEventListeners = ( ) => {
|
||||||
proto.addEventListener = new Proxy(proto.addEventListener, {
|
const eventListenerHandler = {
|
||||||
apply: function(target, thisArg, args) {
|
apply: function(target, thisArg, args) {
|
||||||
let type, handler;
|
let type, handler;
|
||||||
try {
|
try {
|
||||||
@ -475,7 +505,23 @@ function addEventListenerDefuser(
|
|||||||
if ( matchesBoth ) { return; }
|
if ( matchesBoth ) { return; }
|
||||||
return Reflect.apply(target, thisArg, args);
|
return Reflect.apply(target, thisArg, args);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
self.EventTarget.prototype.addEventListener = new Proxy(
|
||||||
|
self.EventTarget.prototype.addEventListener,
|
||||||
|
eventListenerHandler
|
||||||
|
);
|
||||||
|
self.document.addEventListener = new Proxy(
|
||||||
|
self.document.addEventListener,
|
||||||
|
eventListenerHandler
|
||||||
|
);
|
||||||
|
self.addEventListener = new Proxy(
|
||||||
|
self.addEventListener,
|
||||||
|
eventListenerHandler
|
||||||
|
);
|
||||||
|
};
|
||||||
|
runAt(( ) => {
|
||||||
|
trapEddEventListeners();
|
||||||
|
}, details.runAt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -979,6 +1025,9 @@ builtinScriptlets.push({
|
|||||||
name: 'set-constant.js',
|
name: 'set-constant.js',
|
||||||
aliases: [ 'set.js' ],
|
aliases: [ 'set.js' ],
|
||||||
fn: setConstant,
|
fn: setConstant,
|
||||||
|
dependencies: [
|
||||||
|
'run-at.fn',
|
||||||
|
],
|
||||||
});
|
});
|
||||||
function setConstant(
|
function setConstant(
|
||||||
arg1 = '',
|
arg1 = '',
|
||||||
@ -1144,22 +1193,9 @@ function setConstant(
|
|||||||
};
|
};
|
||||||
trapChain(window, chain);
|
trapChain(window, chain);
|
||||||
}
|
}
|
||||||
const runAt = details.runAt;
|
runAt(( ) => {
|
||||||
if ( runAt === 0 ) {
|
|
||||||
setConstant(chain, cValue); return;
|
|
||||||
}
|
|
||||||
const docReadyState = ( ) => {
|
|
||||||
return ({ loading: 1, interactive: 2, complete: 3, })[document.readyState] || 0;
|
|
||||||
};
|
|
||||||
if ( docReadyState() >= runAt ) {
|
|
||||||
setConstant(chain, cValue); return;
|
|
||||||
}
|
|
||||||
const onReadyStateChange = ( ) => {
|
|
||||||
if ( docReadyState() < runAt ) { return; }
|
|
||||||
setConstant(chain, cValue);
|
setConstant(chain, cValue);
|
||||||
document.removeEventListener('readystatechange', onReadyStateChange);
|
}, details.runAt);
|
||||||
};
|
|
||||||
document.addEventListener('readystatechange', onReadyStateChange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
Loading…
Reference in New Issue
Block a user