Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@adguard/scriptlets

AdguardTeam3.9kGPL-3.02.1.7TypeScript support: included

AdGuard's JavaScript library of Scriptlets and Redirect resources

readme

AdGuard Scriptlets and Redirect Resources

AdGuard's Scriptlets and Redirect resources library which provides extended capabilities for content blocking.


Scriptlets

Scriptlet is a JavaScript function which can be used in a declarative manner in AdGuard filtering rules.

AdGuard supports a lot of different scriptlets. Please note, that in order to achieve cross-blocker compatibility, we also support syntax of uBO and ABP.

Syntax

Blocking rules

[domains]#%#//scriptlet(name[, arguments])
  • domains — optional, a list of domains where the rule should be applied;
  • name — required, a name of the scriptlet from AdGuard Scriptlets library;
  • arguments — optional, a list of string arguments (no other types of arguments are supported).

Remarks

  • The meaning of the arguments depends on the scriptlet.

  • Special characters in scriptlet argument must be escaped properly:

    • valid:
      • 'prop["nested"]'
      • "prop['nested']"
      • 'prop[\'nested\']'
      • "prop[\"nested\"]"
    • not valid:
      • 'prop['nested']'
      • "prop["nested"]"
  • Scriptlet name and each of the arguments should be wrapped in quotes. You can use either single or double quotes for the scriptlet name and arguments. Single quote is recommended but not for cases when its usage makes readability worse, e.g. ".css('display','block');" is more preferred then '.css(\'display\',\'block\');'.

Exception rules

[domains]#@%#//scriptlet([name[, arguments]])
  • domains — optional, a list of domains where the rule should be applied;
  • name — optional, a name of the scriptlet to except from the applying; if not set, all scriptlets will not be applied;
  • arguments — optional, a list of string arguments to match the same blocking rule and disable it.

Examples

  1. Apply the abort-on-property-read scriptlet on all pages of example.org and its subdomains, and passes one argument to it (alert):

     example.org#%#//scriptlet('abort-on-property-read', 'alert')
  2. Remove the branding class from all div[class^="inner"] elements on all pages of example.org and its subdomains:

     example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]')
  3. Apply set-constant and set-cookie on any webpage, but because of specific scriptlet exception rule only set-constant scriptlet will be applied on example.org and its subdomains:

     #%#//scriptlet('set-constant', 'adList', 'emptyArr')
     #%#//scriptlet('set-cookie', 'accepted', 'true')
     example.org#@%#//scriptlet('set-cookie')
  4. Apply adjust-setInterval on any webpage, and set-local-storage-item on all pages of example.com and its subdomains, but there is also multiple scriptlet exception rule, so no scriptlet rules will be applied on example.com and its subdomains:

     #%#//scriptlet('adjust-setInterval', 'count', '*', '0.001')
     example.com#%#//scriptlet('set-local-storage-item', 'ALLOW_COOKIES', 'false')
     example.com#@%#//scriptlet()
  5. Scriptlets list

  6. Scriptlets compatibility table

Trusted scriptlets

Trusted scriptlets are scriptlets with extended functionality. Their names are prefixed with trusted-, e.g trusted-click-element, to be easily distinguished from common scriptlets.

Restriction

Trusted scriptlets application must be restricted due to dangerous nature of their capabilities. Allowed sources of trusted scriptlets are:

  • filters created by AdGuard Team,
  • custom filters which were installed as trusted,
  • user rules.

Trusted scriptlets has no compatibility table as they are not compatible with any other blocker.

Trusted scriptlets list

Redirect resources

AdGuard is able to redirect web requests to a local "resource".

Syntax

AdGuard uses the same filtering rule syntax as uBlock Origin. Also, it is compatible with ABP $rewrite=abp-resource modifier.

$redirect is a modifier for the basic filtering rules so rules with this modifier support all other basic modifiers like $domain, $third-party, $script, etc.

The value of the $redirect modifier must be the name of the resource that will be used for redirection. See the list of available redirect resources.

Priority of $redirect rules is described in the Knowledge Base.

Examples

  • ||example.org/script.js$script,redirect=noopjs — redirects all requests to script.js to the resource named noopjs.
  • ||example.org/test.mp4$media,redirect=noopmp4-1s — requests to example.org/test.mp4 will be redirected to the resource named noopmp4-1s.

uBlock Origin specifies additional resource name none that can disable other redirect rules. AdGuard does not support it, use $badfilter to disable specific rules.


Development

How to build

Install dependencies:

pnpm install

Build dist:

pnpm build

In tsurlfilter directory install and link dependencies, link scriptlets, move into package and build, and create tsurlfilter link.

lerna bootstrap

pnpm link --global "@adguard/scriptlets"

cd ./packages/tsurlfilter
pnpm build
yarn link

In extension directory install dependencies, link packages and build

yarn

yarn link @adguard/scriptlets
yarn link @adguard/tsurlfilter

yarn dev

How to test

Some tests are run in QUnit, some in Vitest.

Run all tests:

pnpm test
  1. QUnit is used for testing of scriptlets, redirects, and helpers:

     pnpm test:qunit [scriptlets | redirects | helpers]

    For scriptlets and redirects test run can be more specific:

     // node test run
     pnpm test:qunit scriptlets --name set-cookie
     pnpm test:qunit redirects --name ati-smarttag
    
     // gui test run
     pnpm test:qunit scriptlets --name set-cookie --gui
     pnpm test:qunit redirects --name ati-smarttag --gui

    For debugging purposes after some test is running in gui mode, you may change your scriptlet/redirect code, and without stopping the server run in new terminal:

     pnpm test:qunit scriptlets --name set-cookie --build
  2. Run all jest tests:

     pnpm test:vitest

    or limit the testing — include may be specified in vitest.config.ts or specify test name in command line, e.g.:

     pnpm test:vitest -t isValidScriptletRule

To run browserstack tests create .env file or copy and rename .env-example.

Fill in <username> and <key> with data from your Browserstack profile. Run next command:

pnpm browserstack

Tests run by jest should be named .spec.js, so they will be not included in the QUnit tests.

Debugging

Use debugger; statement where you need it, run

pnpm test

and open needed HTML file from tests/dist in your browser with devtools

Scriptlets library relies on external packages, such as @adguard/agtree. During development, you might need to link these packages using pnpm link.

How to update wiki

There are two scripts to update wiki:

  1. pnpm wiki:build-table — checks compatibility data updates and updates the compatibility table. Should be run manually while the release preparation.
  2. pnpm wiki:build-docs — updates wiki pages about-scriptlets.md and about-redirects.md. They are being generated from JSDoc-type comments of corresponding scriptlets and redirects source files due to @scriptlet/@redirect and @description tags. Runs automatically while the release build.

Usage

CoreLibs

For CoreLibs usage you should use dist/scriptlets.corelibs.json and dist/redirects.json.

File example:

{
    "version": "1.0.0",
    "scriptlets": [
        {
            "names": [
                "abort-on-property-read",
                "ubo-abort-on-property-read.js",
                "abp-abort-on-property-read"
            ],
            "scriptlet": "function() { ...code... }"
        }
    ]
}

Schema:

{
    "type": "object",
    "properties": {
        "version": {
            "type": "string"
        },
        "scriptlets": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "names": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "scriptlet": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

NPM module

Installation

You can install the library using

  • Yarn: yarn add @adguard/scriptlets
  • NPM: npm install @adguard/scriptlets
  • PNPM: pnpm add @adguard/scriptlets

API description

Scriptlets API

You are welcome to use scriptlets as a CJS modules or ESM modules:

const { scriptlets } = require('@adguard/scriptlets');
// or
import { scriptlets } from '@adguard/scriptlets';

invoke()

/**
 * Returns scriptlet code by `source`.
 *
 * @param source Scriptlet properties.
 *
 * @returns Scriptlet code.
 * @throws An error on unknown scriptlet name.
 */
declare function getScriptletCode(source: Source): string;
declare const scriptlets: {
    invoke: typeof getScriptletCode;
};

where Source is:

interface Source {
    /**
     * Scriptlet name
     */
    name: string;
    /**
     * Arguments for scriptlet function
     */
    args: string[];
    /**
     * {'extension'|'corelibs'} engine Defines the final form of scriptlet string presentation
     */
    engine: string;
    /**
     * Version
     */
    version: string;
    /**
     * flag to enable printing to console debug information
     */
    verbose: boolean;
    /**
     * Source rule text is used for debugging purposes.
     *
     * @deprecated since it is not used in the code anymore.
     */
    ruleText?: string;
    /**
     * Domain name, used to improve logging
     */
    domainName?: string;
    /**
     * Optional unique identifier for a scriptlet instance.
     *
     * This identifier is used to prevent multiple executions of the same scriptlet on the page.
     * If provided, this `uniqueId` will be combined with the scriptlet's `name` and `args`
     * to create a unique identifier for the scriptlet call. This identifier is
     * stored in the `Window.prototype.toString` object to ensure the scriptlet
     * is not executed more than once in the same context.
     *
     * By avoiding multiple executions, it helps in reducing redundant operations and
     * potential side effects that might occur if the same scriptlet is called multiple times.
     *
     * If `uniqueId` is not specified, no such unique identifier is created, and the
     * scriptlet can be called multiple times.
     */
    uniqueId?: string;
}

getScriptletFunction()

/**
 * Returns scriptlet function by `name`.
 *
 * @param {string} name Scriptlet name
 *
 * @returns {Function} — Scriptlet function.
 */
declare function getScriptletFunction(name: any): string;
declare const scriptlets: {
    getScriptletFunction: typeof getScriptletFunction;
};

Properties

SCRIPTLETS_VERSION

type: string

Current version of scriptlets library.

Redirects API

You are welcome to use redirects as a CJS modules or ESM modules:

const { Redirects } = require('@adguard/scriptlets/redirects');
// or
import { Redirects, getRedirectFilename } from '@adguard/scriptlets/redirects';

Redirects class

import { Redirects } from '@adguard/scriptlets';

/**
 * Converts rawYaml into JS object with sources titles used as keys
 */
const redirects = new Redirects(rawYaml)

where rawYaml is a string with YAML content located in dist/redirects.yml.

getRedirect()

/**
 * Returns redirect source object by title
 */
const redirect = redirects.getRedirect('noopjs');

/**
 * Redirect is an object with following props:
 * {
 *     title: 1x1-transparent.gif
 *     comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
 *     contentType: image/gif;base64
 *     content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
 * }
 */

isBlocking()

/**
 * Check if redirect is blocking, e.g. click2load.html
 */
const isBlocking = redirect.isBlocking('click2load.html');

getRedirectFilename()

import { getRedirectFilename } from '@adguard/scriptlets/redirects';
/**
 * For a given name or alias of redirect returns the corresponding filename
 * @param name Name or alias of redirect
 * @returns Redirect's filename with extension
 */
declare function getRedirectFilename(name: string): string;

Validators API

isValidScriptletName()

import { isValidScriptletName } from '@adguard/scriptlets/validators';

/**
 * Checks whether the `name` is valid scriptlet name.
 * Uses cache for better performance.
 *
 * @param name Scriptlet name.
 * @returns True if scriptlet name is a valid one or an empty string,
 * otherwise false.
 */
declare function isValidScriptletName(name: string | null): boolean;

isValidScriptletRule()

/**
 * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid.
 * 2. For UBO and ABP scriptlet first checks their compatibility with ADG
 * by converting them into ADG syntax, and after that checks the name.
 *
 * ADG or UBO rules are "single-scriptlet", but ABP rule may contain more than one snippet
 * so if at least one of them is not valid — whole `ruleText` rule is not valid too.
 *
 * @param rule Any scriptlet rule — ADG or UBO or ABP.
 *
 * @returns True if scriptlet name is valid in rule.
 */
declare function isValidScriptletRule(rule: string | ScriptletInjectionRule): boolean;

isAdgScriptletRule(), isUboScriptletRule(), isAbpSnippetRule()

/**
 * Checks if the `rule` is AdGuard scriptlet rule
 *
 * @param rule - rule text
 * @returns true if given rule is adg rule
 */
declare function isAdgScriptletRule(rule: string): boolean;

/**
 * Checks if the `rule` is uBO scriptlet rule
 *
 * @param rule rule text
 * @returns true if given rule is ubo rule
 */
declare function isUboScriptletRule(rule: string): boolean;

/**
 * Checks if the `rule` is AdBlock Plus snippet
 *
 * @param rule rule text
 * @returns true if given rule is abp rule
 */
declare function isAbpSnippetRule(rule: string): boolean;

isValidAdgRedirectRule()

/**
 * Checks if the `rule` is **valid** AdGuard redirect resource rule
 *
 * @param rule - rule text
 * @returns true if given rule is valid adg redirect
 */
declare function isValidAdgRedirectRule(rule: string): boolean

isRedirectResourceCompatibleWithAdg()

/**
 * Checks if the specified redirect resource is compatible with AdGuard
 *
 * @param redirectName - Redirect resource name to check
 * @returns - true if the redirect resource is compatible with AdGuard
 */
declare function isRedirectResourceCompatibleWithAdg(redirectName: string): boolean;

Converters API

import {
    convertUboToAdg,
    convertAbpToAdg,
    convertScriptletToAdg,
    convertAdgToUbo
} from '@adguard/scriptlets/converters';

convertUboToAdg()

/**
 * Converts string of UBO scriptlet rule to AdGuard scriptlet rule
 *
 * @param rule UBO scriptlet rule
 * @returns array with one AdGuard scriptlet rule
 *
 * @deprecated
 */
declare function convertUboToAdg(rule: string | ScriptletInjectionRule): string[];

Note that parameters in UBO rule should be separated by comma + space. Otherwise, the rule is not valid.

convertAbpToAdg()

/**
 * Convert string of ABP snippet rule to AdGuard scriptlet rule
 *
 * @param rule ABP snippet rule
 * @returns array of AdGuard scriptlet rules, one or few items depends on Abp-rule
 */
declare function convertAbpToAdg(rule: string | ScriptletInjectionRule): string[];

convertScriptletToAdg()

/**
 * Converts any scriptlet rule into AdGuard syntax rule.
 * Comments and non-scriptlet rules are returned without changes.
 *
 * @param rule Rule.
 *
 * @returns Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP.
 * For the ADG `rule` validates its syntax, and returns an empty array if it is invalid.
 */
declare function convertScriptletToAdg(rule: string | ScriptletInjectionRule): string[];

convertAdgToUbo()

/**
 * Converts AdGuard scriptlet rule to UBO syntax.
 *
 * @param rule AdGuard scriptlet rule
 * @returns UBO scriptlet rule
 * or undefined if `rule` is not valid AdGuard scriptlet rule.
 */
declare function convertAdgToUbo(rule: string | ScriptletInjectionRule): string | undefined;

convertAdgRedirectToUbo()

/**
 * Converts Adg redirect rule to Ubo one
 * 1. Checks if there is Ubo analog for Adg rule
 * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo
 *    and if there are no one we add it manually to the end.
 *    Source types are chosen according to redirect name
 *    e.g. ||ad.com^$redirect=<name>,important  ->>  ||ad.com^$redirect=<name>,important,script
 * 3. Replaces Adg redirect name by Ubo analog
 *
 * Note: if adg redirect uses UBO's priority syntax, it will be lost on conversion, e.g:
 * ||example.com$redirect=noopjs:99 => ||example.com$redirect=noop.js
 *
 * @param rule adg rule
 * @returns converted ubo rule
 * @throws on incompatible rule
 */
declare function convertAdgRedirectToUbo(rule: string): string;

Browser Compatibility

Browser Version
Chrome ✅ 55
Firefox ✅ 52
Edge ✅ 15
Opera ✅ 42
Safari ✅ 13
Internet Explorer

Projects using Scriptlets

changelog

Scriptlets and Redirect Resources Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

Added

  • Ability to set random response content in prevent-fetch scriptlet #416.
  • Ability to choose CSS injection method in inject-css-in-shadow-dom scriptlet #477.
  • TypeScript types for CoreLibs provided ContentScriptApi.
  • Trusted Types API utility — PolicyApi.

Changed

  • Improved docs for json-prune, xml-prune and trusted-prune-inbound-object scriptlets #392.

v2.1.7 - 2025-04-03

Changed

Added

  • Ability in prevent-addEventListener scriptlet to match specific element and updated log-addEventListener scriptlet to log target element #480.

v2.1.6 - 2025-03-06

Fixed

  • Incorrectly removing content from parsed array when using the json-prune scriptlet #482.

v2.1.5 - 2025-02-28

Changed

Added

  • Ability in json-prune scriptlet to match key with specific value and remove array/object if it contains specific item #183.

Fixed

  • prevent-eval-if and prevent-bab scriptlets, now eval.toString() call returns original value #481.

v2.1.4 - 2025-01-20

Changed

  • ESM-only bundle.
  • trusted-click-element scriptlet, now when containsText is used then it will search for all given selectors and click on the first element with matched text #468.

Fixed

  • Issue with metrika-yandex-tag redirect when it's used as a scriptlet #472.
  • Issue with trusted-click-element scriptlet when delay was used and the element was removed and added again before it was clicked #391.

v2.0.1 - 2024-11-13

Added

  • prevent-canvas scriptlet #451.
  • trusted-types policy to trusted-replace-node-text scriptlet #457.
  • parentSelector option to search for nodes for remove-node-text scriptlet #397.
  • transform option with base64decode value for href-sanitizer scriptlet #455.
  • removeParam and removeHash values in transform option for href-sanitizer scriptlet #460.
  • New values to set-cookie and set-local-storage-item scriptlets: forbidden, forever #458.

Changed

  • Set response ok to false by prevent-fetch if response type is opaque #441.
  • Improve prevent-xhr — modify response #415.
  • Improve prevent-xhr — add missed events #414.
  • Source type instead of IConfiguration.
  • API structure. Validators, Converters, Scriptlets and redirects are now separate modules.
  • The minimum supported Safari version is now 13.
  • Updated @adguard/agtree to 3.0.0-alpha.1.

Removed

  • IIFE bundle.
  • UMD bundle.
  • Various conversion and validation functions including isAdgRedirectRule, isAdgRedirectCompatibleWithUbo, isUboRedirectCompatibleWithAdg, isAbpRedirectCompatibleWithAdg, convertUboRedirectToAdg, convertAbpRedirectToAdg, convertRedirectToAdg, and convertRedirectNameToAdg functions.

v1.12.1 - 2024-09-20

Added

  • Integrated @adguard/agtree library for working with rules, compatibility tables, validator and converter.

Fixed

  • Re-adding element on every DOM change in trusted-create-element scriptlet #450.
  • Setting cookie which name has special prefix __Host- or __Secure- by trusted-set-cookie and trusted-set-cookie-reload scriptlets #448.

v1.11.27 - 2024-08-29

Added

  • reload option for trusted-click-element scriptlet #301.
  • Support for matching line number in abort-on-stack-trace scriptlet when inlineScript or injectedScript option is used #439.
  • New values to set-cookie and set-cookie-reload scriptlets: checked, unchecked #444.
  • New values to set-local-storage-item and set-session-storage-item scriptlets: allowed, denied #445.
  • UBO aliases noop-vast2.xml, noop-vast3.xml, and noop-vast4.xml for correspondent AdGuard redirects.
  • New field uniqueId to scriptlet configuration, allowing scriptlets to be executed only once per context.

Changed

  • UBO alias noop-vmap1.0.xml for noopvmap-1.0 redirect is replaced by noop-vmap1.xml.

Fixed

  • Modifying RegExp.$1, …, RegExp.$9 values in log-on-stack-trace and abort-on-stack-trace scriptlets #384.

v1.11.16 - 2024-08-01

Added

  • trusted-set-session-storage-item scriptlet #426.
  • New values to set-cookie and set-cookie-reload scriptlets: essential, nonessential #436.
  • $currentISODate$ as a new possible value to set-cookie, set-cookie-reload, set-local-storage-item and set-session-storage-item scriptlets #435.

Fixed

  • Re-adding element after removing it in trusted-create-element scriptlet #434.
  • trusted-click-element scriptlet does not click on an element that is already in the DOM #437.

v1.11.6 - 2024-07-08

Added

  • New values to set-cookie and set-cookie-reload scriptlets: hide, hidden #433.
  • New values to set-local-storage-item and set-session-storage-item scriptlets: accept, accepted, reject, rejected #429.
  • Ability to log original and modified content in trusted-replace-node-text, xml-prune, m3u-prune, trusted-replace-fetch-response and trusted-replace-xhr-response scriptlets #411.

Changed

v1.11.1 - 2024-06-13

Added

  • trusted-dispatch-event scriptlet #382.
  • trusted-replace-outbound-text scriptlet #410.
  • Ability to click on the element with specified text in trusted-click-element scriptlet #409.
  • Ability to click element in closed shadow root in trusted-click-element scriptlet #423.
  • isRedirectResourceCompatibleWithAdg() method to check compatibility of redirect resources with AdGuard without needing the full rule text #420.

Deprecated

  • ruleText option in the IConfiguration.

Fixed

  • set-attr value cannot be set to minimum 0 and maximum 32767 possible value #425.

v1.10.25 - 2024-03-28

Added

  • trusted-suppress-native-method scriptlet #383.
  • json-prune-fetch-response scriptlet #361.
  • json-prune-xhr-response scriptlet #360.
  • href-sanitizer scriptlet #327.
  • no-protected-audience scriptlet #395.
  • The ability for prevent-fetch scriptlet to set cors as a response type #394.
  • The ability for trusted-click-element scriptlet to click inside open shadow doms #323.
  • Domain value for setting cookie scriptlets #389.
  • Multiple redirects can now be used as scriptlets #300:
    • amazon-apstag;
    • didomi-loader;
    • fingerprintjs2;
    • fingerprintjs3;
    • gemius;
    • google-analytics;
    • google-analytics-ga;
    • google-ima3;
    • googlesyndication-adsbygoogle;
    • googletagservices-gpt;
    • matomo;
    • metrika-yandex-tag;
    • metrika-yandex-watch;
    • naver-wcslog;
    • pardot-1.0;
    • prebid;
    • scorecardresearch-beacon.

Changed

  • Validation of scriptlet rules with no name and args for multiple scriptlet exception rules #377.
  • Cookie name is not encoded by cookie setting scriptlets #408.
  • Increased the possible numeric value up to 32767 for set-cookie and set-cookie-reload scriptlets #388.

Fixed

  • UBO→ADG conversion of $remove$ scriptlet param #404.
  • set-constant scriptlet not setting a constant over falsy values #403.

v1.10.1 - 2024-02-12

Added

  • call-nothrow scriptlet #333.
  • spoof-css scriptlet #317.
  • trusted-create-element scriptlet #278.
  • trusted-set-attr scriptlet #281.
  • Ability of set-attr to set an attribute value as a copy of another attribute value of the same element.
  • UBO alias for set-cookie-reload scriptlet #332.
  • New values t, f, necessary, required for set-cookie and set-cookie-reload #379.

v1.9.105 - 2023-12-25

Added

  • OmidVerificationVendor object to google-ima3 redirect #353.
  • ga.q (queued commands) to google-analytics redirect #355.

Fixed

  • addEventListener in EventHandler in google-ima3 redirect, now it binds context to callback #353.
  • AdDisplayContainer constructor in google-ima3 redirect, now it adds div element to container #353.
  • getInnerError method in google-ima3 redirect, now it returns null #353.

v1.9.101 - 2023-11-30

Added

  • emptyStr value for responseBody in prevent-fetch scriptlet #364.
  • setPrivacySettings() method to googletagservices-gpt redirect #344.
  • UBO alias noop.json for noopjson redirect.
  • Library version number to the exports AdguardBrowserExtension#2237.

Changed

  • prevent-fetch scriptlet, if responseType is set to opaque then now response body is set to null, status is set to 0 and statusText is set to '' #364.

v1.9.96 - 2023-11-15

Added

  • Regular expression support for removing items in set-local-storage-item and set-session-storage-item scriptlets #256.
  • Ability to set proxy trap in set-constant scriptlet #330.

v1.9.91 - 2023-11-13

Added

  • trusted-prune-inbound-object scriptlet #372.
  • New values to set-cookie scriptlet: on, off, accepted, notaccepted, rejected, allowed, disallow, enable, enabled, disable, disabled #375.
  • New values to set-local-storage-item and set-session-storage-item scriptlets: on, off #366.

Fixed

  • Setting proxy trap every time when property is accessed in set-constant scriptlet #380.
  • Issue with stack in evaldata-prune scriptlet #378.
  • Setting values to wrong properties in set-constant scriptlet #373.

v1.9.83 - 2023-10-13

Added

  • ABP alias for the log scriptlet.

Fixed

  • Issue with trusted-replace-fetch-response scriptlet in case if data URL was used and properties was set by Object.defineProperty to deceive scriptlet #367.
  • Adding the same header value in trusted-replace-xhr-response scriptlet when it is used multiple times for the same request #359.
  • Not pruning in m3u-prune scriptlet if file contains carriage return #354.
  • Not overriding value in set-constant (only partially, for cases where single scriptlet is used) #330.

v1.9.72 - 2023-08-25

Added

  • Conversion for scriptlets:
    • set-attr;
    • set-cookie;
    • set-local-storage-item;
    • set-session-storage-item.

v1.9.70 - 2023-08-21

Added

  • Support for XPath in xml-prune scriptlet #325.
  • Conversion of UBO's $redirect priority to the converter tsurlfilter#59.

Fixed

  • Issue with stack in json-prune scriptlet #348.
  • Issue with obligatoryProps in json-prune scriptlet #345.

v1.9.62 - 2023-08-04

Fixed

  • prevent-xhr closure bug on multiple requests #347.

v1.9.61 - 2023-08-01

Added

  • convertRedirectNameToAdg() method to convert redirect names to ADG #346.

v1.9.58 - 2023-07-27

Fixed

  • Escape commas in the params during conversion to ubo rules #343.

v1.9.57 - 2023-07-21

Added

  • Ability to remove an item from storage in set-local-storage-item and set-session-storage-item scriptlets #338.
  • New values to set-cookie and set-cookie-reload scriptlets: Accept, Reject, y, n, N, No, allow, deny #336.
  • Ability to use flags in regular expression scriptlet parameters #303.

Changed

  • Predefined values of set-cookie and set-cookie-reload are now case-insensitive #342.

Fixed

  • Overwriting google.ima value if it was already set #331.
  • Printing unnecessary logs to the console in log-addEventListener scriptlet #335.
  • Error throwing in prevent-fetch and prevent-xhr scriptlets when a request is blocked #334.

v1.9.37 - 2023-06-06

Added

  • evaldata-prune scriptlet #322.
  • trusted-replace-node-text scriptlet #319.
  • remove-node-text scriptlet #318.
  • Ability for prevent-element-src-loading scriptlet to prevent inline onerror and match link tag #276.
  • New special value modifiers for set-constant #316.

Changed

  • trusted-set-cookie and trusted-set-cookie-reload scriptlets to not encode cookie name and value #311.
  • Improved prevent-fetch: if responseType is not specified, original response type is returned instead of default #297.

Fixed

  • Pruning when addEventListener was used before calling send() method in m3u-prune and xml-prune scriptlets #315.
  • Issue with updateTargetingFromMap() method in googletagservices-gpt redirect #293.
  • Website reloading if $now$/$currentDate$ value is used in trusted-set-cookie-reload scriptlet #291.
  • getResponseHeader() and getAllResponseHeaders() methods mock in prevent-xhr scriptlet #295.

v1.9.7 - 2023-03-14

Added

  • Ability for trusted-click-element scriptlet to click element if cookie/localStorage item doesn't exist #298.
  • Static delay between multiple clicks in trusted-click-element #284.

Changed

  • Improved the convertScriptletToAdg() method — now it validates the input rule syntax if it is an ADG rule.

Fixed

  • Issue with MutationObserver.disconnect() in trusted-click-element #284.

v1.9.1 - 2023-03-07

Added

  • m3u-prune scriptlet #277.
  • true and false values for set-attr scriptlet #283.
  • UBO alias noop.css for noopcss redirect.

Changed

  • Decreased the minimal value for the boost parameter to 0.001 for adjust-setTimeout and adjust-setInterval #262.

Fixed

  • prevent-element-src-loading throwing error if thisArg is undefined #270.
  • Logging null in json-prune #282.
  • xml-prune: no pruning a request if new Request() is used, throwing an error while logging some requests #289.
  • Improve performance of the isValidScriptletName() method.

v1.8.2 - 2023-01-19

Added

  • trusted-set-constant scriptlet #137.
  • inject-css-in-shadow-dom scriptlet #267.
  • throwFunc and noopCallbackFunc prop values for set-constant scriptlet.
  • recreateIframeForSlot method mock to googletagservices-gpt redirect #259.

Changed

  • Added decimal delay matching for prevent-setInterval and prevent-setTimeout #247.
  • Debug logging to include rule text when available.
  • getScriptletFunction calls to throw error on unknown scriptlet names.

Fixed

  • prevent-xhr and trusted-replace-xhr-response closure bug on multiple requests #261.
  • Missing googletagmanager-gtm in compatibility table.

v1.7.20 - 2022-12-26

Added

  • isBlocking() method for Redirects class.
  • file field for redirect type.

Fixed

  • Redirects types.

v1.7.19 - 2022-12-22

Fixed

  • prevent-addEventListener and log-addEventListener loosing context. when encountering already bound .addEventListener.
  • google-ima3 conversion.

v1.7.14 - 2022-12-16

Added

v1.7.13 - 2022-12-13

Fixed

  • isEmptyObject helper not counting prototype as an object property.

v1.7.10 - 2022-12-07

Added

  • trusted-set-cookie-reload scriptlet.

Fixed

  • set-cookie-reload infinite page reloading #265.
  • Breakage of prevent-element-src-loading due to window getting into apply wrapper #264.
  • Spread of args bug at getXhrData call for trusted-replace-xhr-response.
  • Request properties array not being served to getRequestData and parseMatchProps helpers.

v1.7.3 - 2022-11-21

Added

  • Trusted scriptlets with extended capabilities:

    • trusted-click-element #23;
    • trusted-replace-xhr-response #202;
    • trusted-replace-fetch-response;
    • trusted-set-local-storage-item;
    • trusted-set-cookie.
  • Scriptlets:

Changed

  • Scriptlets:
    • prevent-element-src-loading #228;
    • prevent-fetch #216;
    • abort-on-stack-trace #201;
    • abort-current-inline-script #251;
    • set-cookie & set-cookie-reload.
  • Redirects:
    • google-ima3 #255;
    • metrika-yandex-tag #254;
    • googlesyndication-adsbygoogle #252.