Skip to content

Instantly share code, notes, and snippets.

@fdebijl
Last active February 26, 2018 15:17
Show Gist options
  • Save fdebijl/46f79734e9e8d5d3cea290d2eaffdc48 to your computer and use it in GitHub Desktop.
Save fdebijl/46f79734e9e8d5d3cea290d2eaffdc48 to your computer and use it in GitHub Desktop.
ProPublica - content.js
// Reclame's in de tijdlijn zelf hebben deze klasse
const TIMELINE_SELECTOR = ".userContentWrapper";
// Reclame's in de sidebar krijgen deze klasse
const SIDEBAR_SELECTOR = ".ego_unit";
// Deze functie wordt elke vijf seconden uitgevoerd om alle reclames op de
// pagina te versturen naar het achtergrondscript (later meer uitleg hierover)
const sendAds = function() {
let posts = Array.from(document.querySelectorAll(SIDEBAR_SELECTOR)).concat(
Array.from(document.querySelectorAll(TIMELINE_SELECTOR))
);
// De resultaten van de verwerkingsfunctie worden later in deze variabele gestopt
let results = [];
// Verzamel alle elementen die reclame kunnen zijn en stuur ze naar de advertentiechecker (parser())
let scraper = posts.reduce(
(p, i) =>
p.then(() => {
// Zet een timer voor de advertentiecheck - deze mag maximaal vijf seconden duren
let timeout = new Promise(resolve =>
setTimeout(() => resolve(false), 5000)
);
// Kijk of het element (i) een advertentie is, als dat het geval is dan wordt
// deze toegevoegd aan de resultaten (results)
return Promise.race([
parser(i).then(it => results.push(it), e => console.log(e)),
timeout
]);
}),
Promise.resolve(null)
);
// Stuur de reclames naar het achtergrondscript zodra de scraper klaar is
scraper.then(() => {
chrome.runtime.sendMessage(results.filter(i => i));
});
};
// Let op veranderingen aan de pagina, als deze plaatsvinden voer
// dan bovenstaande functie uit (maximaal eens per vijf seconden)
let a = new MutationObserver(debounce(sendAds, 5000));
a.observe(document.body, { childList: true, subtree: true });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment