@cliqz/autoconsent
Version:
This is a library of rules for navigating through common consent popups on the web. These rules can be run in a Firefox webextension, or in a puppeteer orchestrated headless browser. Using these rules, opt-in and opt-out options can be selected automatica
178 lines (177 loc) • 6.57 kB
JavaScript
/**
* This code is in most parts copied from https://github.com/cavi-au/Consent-O-Matic/blob/master/Extension/Tools.js
* which is licened under the MIT.
*/
export default class Tools {
static setBase(base) {
Tools.base = base;
}
static findElement(options, parent = null, multiple = false) {
let possibleTargets = null;
if (parent != null) {
possibleTargets = Array.from(parent.querySelectorAll(options.selector));
}
else {
if (Tools.base != null) {
possibleTargets = Array.from(Tools.base.querySelectorAll(options.selector));
}
else {
possibleTargets = Array.from(document.querySelectorAll(options.selector));
}
}
if (options.textFilter != null) {
possibleTargets = possibleTargets.filter(possibleTarget => {
let textContent = possibleTarget.textContent.toLowerCase();
if (Array.isArray(options.textFilter)) {
let foundText = false;
for (let text of options.textFilter) {
if (textContent.indexOf(text.toLowerCase()) !== -1) {
foundText = true;
break;
}
}
return foundText;
}
else if (options.textFilter != null) {
return textContent.indexOf(options.textFilter.toLowerCase()) !== -1;
}
});
}
if (options.styleFilters != null) {
possibleTargets = possibleTargets.filter(possibleTarget => {
let styles = window.getComputedStyle(possibleTarget);
let keep = true;
for (let styleFilter of options.styleFilters) {
let option = styles[styleFilter.option];
if (styleFilter.negated) {
keep = keep && option !== styleFilter.value;
}
else {
keep = keep && option === styleFilter.value;
}
}
return keep;
});
}
if (options.displayFilter != null) {
possibleTargets = possibleTargets.filter(possibleTarget => {
if (options.displayFilter) {
//We should be displayed
return possibleTarget.offsetHeight !== 0;
}
else {
//We should not be displayed
return possibleTarget.offsetHeight === 0;
}
});
}
if (options.iframeFilter != null) {
possibleTargets = possibleTargets.filter(possibleTarget => {
if (options.iframeFilter) {
//We should be inside an iframe
return window.location !== window.parent.location;
}
else {
//We should not be inside an iframe
return window.location === window.parent.location;
}
});
}
if (options.childFilter != null) {
possibleTargets = possibleTargets.filter(possibleTarget => {
let oldBase = Tools.base;
Tools.setBase(possibleTarget);
let childResults = Tools.find(options.childFilter);
Tools.setBase(oldBase);
return childResults.target != null;
});
}
if (multiple) {
return possibleTargets;
}
else {
if (possibleTargets.length > 1) {
console.warn("Multiple possible targets: ", possibleTargets, options, parent);
}
return possibleTargets[0];
}
}
static find(options, multiple = false) {
let results = [];
if (options.parent != null) {
let parent = Tools.findElement(options.parent, null, multiple);
if (parent != null) {
if (parent instanceof Array) {
parent.forEach(p => {
let targets = Tools.findElement(options.target, p, multiple);
if (targets instanceof Array) {
targets.forEach(target => {
results.push({
parent: p,
target: target
});
});
}
else {
results.push({
parent: p,
target: targets
});
}
});
return results;
}
else {
let targets = Tools.findElement(options.target, parent, multiple);
if (targets instanceof Array) {
targets.forEach(target => {
results.push({
parent: parent,
target: target
});
});
}
else {
results.push({
parent: parent,
target: targets
});
}
}
}
}
else {
let targets = Tools.findElement(options.target, null, multiple);
if (targets instanceof Array) {
targets.forEach(target => {
results.push({
parent: null,
target: target
});
});
}
else {
results.push({
parent: null,
target: targets
});
}
}
if (results.length === 0) {
results.push({
parent: null,
target: null
});
}
if (multiple) {
return results;
}
else {
if (results.length !== 1) {
console.warn("Multiple results found, even though multiple false", results);
}
return results[0];
}
}
}
Tools.base = null;