AdguardTeam / AdguardTeam/Scriptlets

New approach to scriptlets

未关闭
#83 0 条评论 0 个 reaction 已指派 1 人 已被 @ameshkov 认领 在 GitHub 查看
enhancement Priority: P4 Version: Scriptlets v3.0
主要语言
JavaScript
星标
195
派生
33
PR 合并指标
30 天内没有已合并 PR

描述

_Originally posted by @ameshkov in https://github.com/AdguardTeam/Scriptlets/issues/82#issuecomment-625230500_

Check out all the comments in the thread.

Here are some thoughts on this.

Currently, there are two important scriptlets groups:

* Override a property get/set and do something.
* Override a function call and do something.

The algorithm, in general, may look like this:

1. Override a property or a function.
2. Once it's called, check the "matchers" specified in the rule: stack trace, script content, function call arguments.
3. Apply one of the possible actions.

Here are some of the existing scriptlets written this way (don't mind the naming, I am coming up with this right now):
```
! noeval
function('window.eval'):match-argument(1, /regex/):noop()
! set-constant
property('window.test', 'get'):return-constant(true)
! log-eval
function('window.eval):log()'
! prevent-setInterval / no-setInterval-if
function('window.setInterval'):match-argument(1, /regex/):match-argument(2, 500):noop()
! json-prune
function('JSON.parse'):match-argument-json-props(1, 'someProp'):remove-json-props-and-return(1, 'someProp')
```
> I am not sure about the `JSON.parse` example, though. Having the capability to apply this kind of modification to an arbitrary function call can be dangerous in the wrong hands.

This approach makes adding new matching criteria really easy. Just a couple of examples that can be useful: `match-url`, `match-selector`, etc.

Some scriptlets that cannot be categorized as "function", "property" or "matcher" will be categorized as "actions", and it should still be possible to apply some "matchers" to them. For instance:
```
! run remove-attr only on a specific page
:match-url('some-page-url'):remove-attr('onclick', 'selector>here')
```

贡献指南

这个仓库没有索引到贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。