Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New approach to scriptlets #83

Open
ameshkov opened this issue May 7, 2020 · 0 comments
Open

New approach to scriptlets #83

ameshkov opened this issue May 7, 2020 · 0 comments
Assignees
Labels

Comments

@ameshkov
Copy link
Member

ameshkov commented May 7, 2020

Originally posted by @ameshkov in #82 (comment)

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')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants