Giter Club home page Giter Club logo

autoconsent's Introduction

Autoconsent

This is a library of rules for navigating through common consent popups on the web. These rules can be run in a Chrome extension, or in a Playwright-orchestrated headless browser. Using these rules, opt-in and opt-out options can be selected automatically, without requiring user-input.

Browser extension

The web extension can be built with the following steps:

# Download dependencies
npm ci
# Build the extension
npm run prepublish

The extension-specific code can be found in the addon directory. There are two versions of the addon (found under dist/addon after building), one for mv3 version for Chromium-based browsers, and a firefox version for Firefox. You can load these in Chrome in developer mode, and in Firefox as a temporary addon.

Rules

The library's functionality is implemented as a set of rules that define how to manage consent on a subset of sites. These generally correspond to specific Consent Management Providers (CMPs) that are installed on multiple sites. Each CMP ruleset defines:

  • If the site is using that CMP
  • If a popup is displayed
  • Steps to specify an 'opt-in' or 'opt-out' consent for the CMP.
  • Optionally, a test if the consent was correctly applied.

There are currently three ways of implementing a CMP:

  1. As a JSON ruleset, intepreted by the AutoConsent class.
  2. As a class implementing the AutoCMP interface. This enables more complex logic than the linear AutoConsent rulesets allow.
  3. As a Consent-O-Matic rule. The ConsentOMaticCMP class implements compability with rules written for the Consent-O-Matic extension.

Intermediate rules

Sometimes the opt-out process requires actions that span across multiple pages or iframes. In this case it is necessary to define stages (each corresponding to a separate page context) as separate rulesets. Each one, except the very last stage, must be marked as intermediate using the intermediate: true flag. If the intermediate flag is not set correctly, autoconsent may report a successful opt-out even if it is not yet finished.

Context filters

By default, rules will be executed in all top-level documents. Some rules are designed for specific contexts (e.g. only nested iframes, or only specific URLs). This can be configured in runContext field (see the syntax reference below).

Rule Syntax Reference

An autoconsent CMP rule can be written as either:

  • a JSON file adhering to the AutoConsentCMPRule type.
  • a class implementing the AutoCMP interface, or
    • common JSON rules are available as reusable functions in dom-actions.ts. You can also use existing class-based rules as reference.

In most cases the JSON syntax should be sufficient, unless some complex non-linear logic is required, in which case a class is required.

Both JSON and class implementations have the following components:

  • name - to identify this CMP.
  • detectCMP - which determines if this CMP is included on the page.
  • detectPopup - which determines if a popup is being shown by the CMP.
  • optOut - a list of actions to do an 'opt-out' from the popup screen. i.e. denying all consents possible.
  • optIn - a list of actions for an 'opt-in' from the popup screen.
  • (optional) prehideSelectors - a list of CSS selectors to "pre-hide" early before detecting a CMP. This helps against flickering. Pre-hiding is done using CSS opacity and z-index, so be it should be used with care to prevent conflicts with the opt-out process.
  • (optional) intermediate - a boolean flag indicating that the ruleset is part of a multi-stage process, see the Intermediate rules section. This is false by default.
  • (optional) runContext - an object describing when this rule should be tried:
    • main - boolean, set to true if the rule should be executed in top-level documents (default: true)
    • frame - boolean, set to true if the rule should be executed in nested frames (default: false)
    • urlPattern - string, specifies a regular expression that should match the page URL (default: empty)
  • (optional) test - a list of actions to verify a successful opt-out. This is currently only used in Playwright tests.

detectCMP, detectPopup, optOut, optIn, and test are defined as a set of checks or actions on the page. In the JSON syntax this is a list of AutoConsentRuleStep objects. For detect checks, we return true for the check if all steps return true. For opt in and out, we execute actions in order, exiting if one fails. The following checks/actions are supported:

Element selectors

Many rules use ElementSelector to locate elements in a page. ElementSelector can be a string, or array of strings, which are used to locate elements as follows:

  • By default, strings are treated as CSS Selectors via the querySelector API. e.g. #reject-cookies to find an element whose id is 'reject-cookies'.
  • Strings prefixed with xpath/ are Xpath selectors which can locate elements in the page via document.evaluate. e.g. xpath///*[@id="reject-cookies"] can find an element whose id is 'reject-cookies'.
  • If an array of strings is given, the selectors are applied in array order, with the search scope constrained each time but the first match of the previous selector. e.g. ['#reject-cookies', 'button'] first looks for an element with id="reject-cookies", then looks for a match for button that is a descendant of that element. If one of the selectors returns an element that has a shadowRoot property, the next selector will run within that element's shadow DOM. This is the main difference from nested CSS selectors, which do not cross shadow DOM boundaries.

For example, consider the following DOM fragment:

<open-shadow-root-element>
 <button>X</button>
</open-shadow-root-element>

Then ['open-shadow-root-element', 'button'] will find the button, but a usual CSS selector 'open-shadow-root-element button' will not.

Element exists

{
  "exists": ElementSelector
}

Returns true if the given selector matches one or more elements.

Element visible

{
  "visible": ElementSelector,
  "check": "any" | "all" | "none"
}

Returns true if elements matched by ElementSelector are currently visible on the page. If check is all, every element must be visible. If check is none, no element should be visible. Visibility check is a CSS-based heuristic.

Wait for element

{
  "waitFor": ElementSelector,
  "timeout": 1000
}

Waits until selector exists in the page. After timeout ms the step fails.

Wait for visibility

{
  "waitForVisible": ElementSelector,
  "timeout": 1000,
  "check": "any" | "all" | "none"
}

Waits until element is visible in the page. After timeout ms the step fails.

Click an element

{
  "click": ElementSelector,
  "all": true | false,
}

Click on an element returned by selector. If all is true, all matching elements are clicked. If all is false, only the first returned value is clicked.

Wait for then click

{
  "waitForThenClick": ElementSelector,
  "timeout": 1000,
  "all": true | false
}

Combines waitFor and click.

Unconditional wait

{
  "wait": 1000,
}

Wait for the specified number of milliseconds.

Hide

{
  "hide": "CSS selector",
  "method": "display" | "opacity"
}

Hide the elements matched by the selectors. method defines how elements are hidden: "display" sets display: none, "opacity" sets opacity: 0. Method is "display" by default. Note that only a single string CSS selector is supported here, not an array.

Eval

{
  "eval": "SNIPPET_ID"
}

Evaluates a code snippet in the context of the page. The rule is considered successful if it evaluates to a truthy value. Snippets have to be explicitly defined in snippets.ts. Eval rules are not 100% reliable because they can be affected by the page scripts, or blocked by a CSP policy on the page. Therefore, they should only be used as a last resort when none of the other rules are sufficient.

Conditionals

{
  "if": { "exists": ElementSelector },
  "then": [
    { "click": ".button1" },
    { "click": ".button3" }
  ],
  "else": [
    { "click": ".button2" }
  ]
}

Allows to do conditional branching in JSON rules. The if section can contain either a "visible" or "exists" rule. Depending on the result of that rule, then or else sequences will be executed. else section is optional. The "if" rule is considered successful as long as all rules inside the chosen branch are successful. The other branch, as well as the result of the condition itself, do not affect the result of the whole rule.

Any

{
  "any": [
    { "exists": ".button1" },
    { "exists": ".button2" }
  ]
}

Evaluates a list of steps in order. If any return true (success), then the step returns true. If all steps return false, the any step returns false.

Optional actions

All rules can include the "optional": true to ignore failure.

API

See this document for more details on internal APIs.

License

MPLv2.

Manual Testing

To test the extension / addon with Firefox, open the about:debugging, navigate to "This Firefox" on the menu and under "Temporary Extensions" click on "Load Temporary Addon". Select the manifest.json file from the dist/firefox directory. You will need to build the extension before as described above. The extension should then be active and you can test it manually by simply visiting websites.

autoconsent's People

Contributors

adewes avatar dependabot[bot] avatar hyebahi avatar icodebyamanda avatar jdorweiler avatar muodov avatar sammacbeth avatar seia-soto avatar tomassie91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autoconsent's Issues

Sourcepoint 'accept all or subscribe' wall

Multiple sites (all using Sourcepoint CMP) are switching to a popup configuration that no longer offers a plain reject option, instead telling users who don't agree to all cookies to subscribe to get a ad-free (hopefully also tracking free) experience. We currently cannot handle these, as an opt-out is not possible without throwing the user to a subscription page.

These sites cause some issues with the Sourcepoint CMP implementation, as in some cases the consent rejection options are still subtly exposed in the popup. However, clicking them either just cases a page reload (#35), or redirects to a login page (voici.fr).

The following sites are currently using Soucepoint cookie paywalls:

  • heise.de (#35)
  • voici.fr
  • bild.de
  • spiegel.de
  • derstandard.at
  • derstandard.de
  • duden.de
  • computerbild.de
  • t-online.de
  • giga.de
  • welt.de

Site breakage: bitsofwar.com

Description

The popup on https://bitsofwar.com/3-kromlech

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version:

Screenshot (optional)

Site breakage: https://www.nytimes.com/

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version: 5.3.0

Screenshot (optional)
image

Site breakage: granit.com

Description

https://www.granit.com/se/ - gray overlay stays over the site after popup is dismissed.

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: 4.3.3

Screenshot (optional)

Site breakage: ebay.co.uk /ebay.com

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: France

Autoconsent version:

Screenshot (optional)
Screenshot 2023-06-27 at 08 47 09

Site breakage: https://www.castorama.pl/ (jquery.cookieBar)

Description

The popup on https://www.castorama.pl/

  • is not detected
  • is not dismissed properly (jquery.cookieBar rule mistakenly detected)
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version: 4.1.3

Screenshot (optional)
image

Site breakage: reddit.com

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other: infinite reload

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: 4.0.0

Screenshot (optional)

Site breakage: https://www.volkswagen.nl/

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version: 5.3.0

Screenshot (optional)
image

Site breakage: yum.com

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Pop-up (OneTrust) is dismissed, but scrolling stays blocked. This also happens when rejecting cookies manually.

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version: 6.0.0

Screenshot (optional)

Rule issue: ausopen.com

  • No longer triggers on ausopen.com (no banner shown).
  • No further sites detected using this CMP.
  • I would propose removal.

Site breakage: https://straeto.is/

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: NL

Autoconsent version: 5.3.0

Screenshot (optional)
image

Site breakage: youtube.com

Description

Dismissing cookies on youtube disables history by default. The current rule for google-consent-standalone makes it impossible to turn it back on
https://app.asana.com/0/1177771139624306/1206194460412262/f

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country:

Autoconsent version:

Screenshot (optional)

Proceed immediately when the first pop-up is detected

Right now the detection may be slowed down if there are multiple CMPs on the page, but only one pop-up is shown. The current logic is roughly:

  1. detect all CMPs (detectCmp rules)
  2. for all detected CMPs, detect actual pop-ups (detectPopup rules). These are done in parallel, but we only proceed further once we finish checking all CMPs, including all the retries for unshown pop-ups
  3. if no visible pop-ups are detected, run detectPopup for cosmetic rules
  4. proceed with opt-out for the first found pop-up

This process can be slow, if e.g. we find 2 CMPs, but only one of them shows a pop-up. In this case, it won't be rejected until we exhaust all retries for the second CMP.

The desired behaviour is:

  • proceed with opt-out immediately once we find any pop-up
  • other pop-ups are still being detected in parallel, and we keep sending an error message if more than one pop-up is detected

Site breakage: dresden.de

Description

The popup on https://www.dresden.de/index_de.php

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

CMP is complianz optin.

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: 0.4.0

Screenshot (optional)
Screenshot 2022-12-27 at 18 13 49

usercentrics-api rule is broken

Description

The popup on https://www.kia.com/us/en

  • is not detected
  • is not dismissed properly
  • other (elaborate below) - gets stuck in a reload loop

usercentrics-api rule is causing an infinite reload

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: v4.4.0

Screenshot (optional)

Re-use autoconsent in Puppeteer headless

I've written a simple NodeJS script for some web tests using a headless Puppeteer. My challenge now is to confirm consent banners (CMP). I've seen, that there is a release 1.0.8 which has a ready-to-run JS for Puppeteer in dist folder, but that seems quite old (i.e. rules.json of release 3.0.0 is much larger).

When trying to include CJS file, like:

const autoConsent = require('@duckduckgo/autoconsent/dist/autoconsent.cjs.js');

NodeJS throws an error:

/mnt/myproject/node_modules/@duckduckgo/autoconsent/dist/autoconsent.cjs.js:14
  [full minified JS code is printed here]
                                          ^

SyntaxError: Unexpected token '.'
    at wrapSafe (internal/modules/cjs/loader.js:915:16)
    at Module._compile (internal/modules/cjs/loader.js:963:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/mnt/myproject/resources/nodejs/check.js:19:21)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)

The problem is, that Puppeteer in headless mode is not able to run browser extensions, so I can't use the MV3 extension.
Please note that I'm not a NodeJS pro, but I want to know if there is a way to implement the current autoconsent 3.0.0 in my JS script?

Needs rule: https://www.asus.com/us/

Description

The popup on [site]

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: Netherlands

Autoconsent version: 4.1.1

Screenshot (optional)
image

Unit tests

Some parts of the code are complex enough that they can benefit from unit testing (as opposed to e2e tests that verify rules). For example, internal logic of handling multiple CMPs, or prioritizing non-cosmetic rules.
We have something resembling unit tests for rule executors, but it's hacky and not extensible.

First thing that comes to mind is using karma, but we can consider other frameworks as well.

Feature Proposal: Adblocker filter like syntax for AutoCMP

Summary

Having adblocker-like syntax let you:

  • have better rule quality by filling missing fields in JSON definition in the rule creation step
  • create and manage the rules faster by having single file containing simple rules
  • publish rules easily to online

This system is opt-in and doesn't disturb current workflow in autoconsent. A dedicated project can be created to manage new syntax and transform the syntax into the current structure of autoconsent.

Please visit the following link for the quick view of suggested syntax.

The Syntax

domain.tld##selector[$option1][,option2=value][, ...]
-selector:action(args)
[-selector:action(args):chainedAction(args)]
[-...]
+selector:action(args)
[+selector:action(args):chainedAction(args)]
[+...]

Examples

The examples below are not fully implemented yet. They're likely to be changed in future.

Basic opt-in and opt-out

domain.tld##detectionSelector$cosmetic
-div#optout:wait(_: 500):click()
+div#optin:waitForVisible():click()

This is equivalent to the following JSON rule:

{
  "name": "domain.tld",
  "cosmetic": true,
  "runContext": {"urlPattern": "^https://(www\\.)?domain\\.tld/"},
  "detectCmp": [{ "exists": "detectionSelector" }],
  "detectPopup": [{ "visible": "detectionSelector" }],
  "optOut": [{ "wait": 500 }, { "click": "div#optout" }],
  "optIn": [{ "waitForVisible": "div#optin" }, { "click": "div#optin" }]
}

Chain multiple opt-in and opt-out actions

domain.tld###popup$cosmetic,name=sample
-div#showAllOptions:waitForVisible(timeout: 1000, check: all)
-div#optout:wait(_: 500):click()
+div#optin:click()

This is equivalent to the following JSON rule:

{
  "name": "sample",
  "cosmetic": true,
  "runContext": {"urlPattern": "^https://(www\\.)?domain\\.tld/"},
  "detectCmp": [{ "exists": "detectionSelector" }],
  "detectPopup": [{ "visible": "detectionSelector" }],
  "optOut": [{ "waitForVisible": "div#showAllOptions", "timeout": 1000, "check": "all" }, { "wait": 500 }, { "click": "div#optout" }],
  "optIn": [{ "click": "div#optin" }]
}

Conditionals

domain.tld###popup$cosmetic
-div#version1:if():exists()
-div#version1.optout:then():click()
-div#version2.optout:else():click()
+div#optin:click()

This is equivalent to the following JSON rule:

{
  "name": "domain.tld",
  "cosmetic": true,
  "runContext": {"urlPattern": "^https://(www\\.)?domain\\.tld/"},
  "detectCmp": [{ "exists": "detectionSelector" }],
  "detectPopup": [{ "visible": "detectionSelector" }],
  "optOut": [{ "if": { "exists": "div#version1" }, "then": [{ "click": "div#version1.optout" }], "else": [{ "click": "div#version2.optout" }] }],
  "optIn": [{ "click": "div#optin" }]
}

Drawbacks

  • Having multiple files is a better way to provide intuitive transparency.
  • Conditional syntaxes are not intuitive to write in current format.

Site breakage: hello-hossy.com

Description

The popup on hello-hossy.com

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: France

Autoconsent version:

Screenshot (optional)
image

Autoconsent standard

I would like to suggest an autoconsent-standard that can be used by website developers / cookie-consent developers.

Assume a website has the following code for the cookie-consent's "OK" button:
<a data-autoconsent="true">OK</a>

Then this could work as follows:

  1. This library looks for elements with a data-autoconsent attribute;
  2. If the library finds such an element, it fires a click-event;
  3. Website-owner implements a (javaScript) listener for the click event and closes the cookie-popup, assuming minimal (functional) cookies.

Perhaps a standard already exists, if so please let me know. I'm looking forward to your opinion :)

--

For reference, see: ghostery/autoconsent#39

Optimize OneTrust rule

OneTrust is by far the most common CMP, but right now it contains huge delays (seconds), so opting out works, but is super slow. This sometimes blocks the website for a few seconds. We should review it and see if it can be optimized.

Here's what I found last time I checked:
After clicking the options button, we need to wait until the pop-up is visible. This is tricky (e.g. on stackoverflow.com) as our waitForVisible() function fails there, so we resort to really long unconditional delays, which cause most of the slow down.
As far as I know, there's no universal way to check the element "visibility" in DOM. We can probably come up with a hack specifically for stackoverflow, but we should be careful not to break the rule on other sites. Some example sites can be found in the monthly crawl data and the test files.

Site breakage: https://www.nhm.ac.uk/

Description

The popup on https://www.nhm.ac.uk/

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Overlay is left after popup is hidden (by 'generic-cosmetic' rule).

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: 4.1.3

Screenshot (optional)
Screenshot 2023-03-16 at 08 27 09

Site breakage: thefreeaudit.com

Description

The popup on https://thefreeaudit.com/

  • is not detected
  • is not dismissed properly
  • other (elaborate below)
    Breaks the site submission form on the page after opt-out.

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country: DE

Autoconsent version: 3.0.4

Screenshot (optional)

Site breakage: sport-stimme.de

Description

The popup on https://sport-stimme.de/

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

CMP is Uniconsent

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

When DuckDuckGo blocking is enabled, the popup does not get shown.

Tested from country: DE

Autoconsent version: 4.0.0

Screenshot (optional)

Overlay on leefgemeenschapzilt.nl

Description

The popup on https://leefgemeenschapzilt.nl/contact/

  • is not detected
  • is not dismissed properly
  • other (elaborate below)

Tested on

  • DuckDuckGo macOS browser
  • DuckDuckGo Windows browser
  • DuckDuckGo Android browser
  • DuckDuckGo iOS browser
  • Chrome browser extension
  • Firefox browser extension

Tested from country:

Autoconsent version:

Screenshot (optional)

Site breakage: www.ffbb.com

Description

  • eu-cookie-compliance-banner rule
  • Hides popup, but overlay is left blocking the page.

Tested from country: DE

Autoconsent version: 10.3.2

Screenshot (optional)

Use privileged APIs for simulating user interaction

This tool relies on unprivileged web content APIs instead of using the proper privileged APIs available to extensions (with debugger permissions) & Chrome DevTools Protocol sessions.

Some consent managers are implemented with security protections that require genuine user interactions that cannot be spoofed by web content APIs.

Additionally, site owners can sabotage this tool by backdooring or breaking the web APIs that it relies on.

Question: how to use this library with Peuppeteer?

Hi,

I stumbled upon this library via this post. The post seems to be a bit outdated as the library has changed, for example it doesn't export the @duckduckgo/autoconsent/dist/autoconsent.puppet.js any longer.

Is there an official how-to guide on how to use this library with Puppeteer? Or at least some up-tp-date code example?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.