@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
87 lines (76 loc) • 2.42 kB
text/typescript
import { AutoCMP, TabActor } from "../types";
export type DetectorConfig = {
presentMatcher: {};
showingMatcher: {};
};
export type MethodConfig = {
action?: any;
name: string;
};
export type ConsentOMaticConfig = {
detectors: DetectorConfig[];
methods: MethodConfig[];
};
export class ConsentOMaticCMP implements AutoCMP {
methods = new Map<string, {}>();
hasSelfTest: boolean;
constructor(public name: string, public config: ConsentOMaticConfig) {
config.methods.forEach(methodConfig => {
if (methodConfig.action) {
this.methods.set(methodConfig.name, methodConfig.action);
}
});
this.hasSelfTest = this.methods.has("TEST_CONSENT");
}
async detectCmp(tab: TabActor): Promise<boolean> {
return (
await Promise.all(
this.config.detectors.map(detectorConfig =>
tab.matches(detectorConfig.presentMatcher)
)
)
).some(matched => matched);
}
async detectPopup(tab: TabActor): Promise<boolean> {
return (
await Promise.all(
this.config.detectors.map(detectorConfig =>
tab.matches(detectorConfig.showingMatcher)
)
)
).some(matched => matched);
}
async executeAction(tab: TabActor, method: string, param?: any) {
if (this.methods.has(method)) {
return tab.executeAction(this.methods.get(method), param);
}
return true;
}
async optOut(tab: TabActor): Promise<boolean> {
await this.executeAction(tab, "HIDE_CMP");
await this.executeAction(tab, "OPEN_OPTIONS");
await this.executeAction(tab, "HIDE_CMP");
await this.executeAction(tab, "DO_CONSENT", []);
await this.executeAction(tab, "SAVE_CONSENT");
return true;
}
async optIn(tab: TabActor): Promise<boolean> {
await this.executeAction(tab, "HIDE_CMP");
await this.executeAction(tab, "OPEN_OPTIONS");
await this.executeAction(tab, "HIDE_CMP");
await this.executeAction(tab, "DO_CONSENT", ['D', 'A', 'B', 'E', 'F', 'X']);
await this.executeAction(tab, "SAVE_CONSENT");
return true;
}
async openCmp(tab: TabActor): Promise<boolean> {
await this.executeAction(tab, "HIDE_CMP");
await this.executeAction(tab, "OPEN_OPTIONS");
return true;
}
test(tab: TabActor): Promise<boolean> {
return this.executeAction(tab, "TEST_CONSENT");
}
detectFrame(tab: TabActor, frame: { url: string }): boolean {
return false;
}
}