Files
FocusGram-Android/assets/scripts/ad_blocker_dom.js
T

62 lines
1.9 KiB
JavaScript

/**
* FocusGram DOM Ad Blocker (Fallback)
*
* DEPRECATED: Use fetch_interceptor.js for reliable ad blocking.
*
* This script provides DOM-based ad removal as a FALLBACK for ads that slip through
* GraphQL filtering. It's not reliable because Instagram has already rendered the content.
*
* Injected at DOCUMENT_END
* Removes sponsored/posts/tracking elements from the DOM.
*/
(function () {
'use strict';
const AD_SIGNALS = [
'Sponsored',
'paid partnership',
'Promoted',
];
const textMatchesSignal = (txt) => {
if (!txt) return false;
const t = txt.trim().toLowerCase();
return AD_SIGNALS.some((s) => t === s.toLowerCase());
};
const removeSponsoredArticles = () => {
try {
// aria-label routes (best-effort; localization may break)
document.querySelectorAll('a[aria-label]').forEach((a) => {
const aria = a.getAttribute('aria-label') || '';
if (textMatchesSignal(aria)) {
const article = a.closest('article');
if (article) article.remove();
}
});
// Text-based removal inside feed articles (best-effort)
document.querySelectorAll('article').forEach((article) => {
const walker = document.createTreeWalker(article, NodeFilter.SHOW_TEXT);
let node;
while ((node = walker.nextNode())) {
const txt = node.nodeValue;
if (textMatchesSignal(txt)) {
article.remove();
break;
}
}
});
// Suggested content is intentionally left alone. Removing suggested
// units after Instagram has virtualized the feed can snap the viewport
// back to the top on some accounts.
} catch (_) {}
};
const observer = new MutationObserver(() => removeSponsoredArticles());
observer.observe(document.body, { childList: true, subtree: true });
removeSponsoredArticles();
})();