diff --git a/src/contentScript.js b/src/contentScript.js index dd887fa..fce3498 100644 --- a/src/contentScript.js +++ b/src/contentScript.js @@ -17,6 +17,7 @@ zero exclusion matters match the URL of the current page) */ function checkForShouldKillSticky(result) { + console.log("checkForShouldKillSticky"); var shouldKillSticky = false; /* If whitelist mode is active, then the matching patterns list is treated @@ -58,6 +59,7 @@ function checkForShouldKillSticky(result) { ‘sticky’ or ‘fixed’, and removes those elements. */ function killSticky(root) { + console.log("killSticky"); root = root || document.querySelector("body"); if (killStickyIfNeeded(root) == false) { root.querySelectorAll('*').forEach(element => { @@ -68,8 +70,10 @@ function killSticky(root) { // Compensate for full-screen paywalls. restoreScrollability(); } + function killStickyIfNeeded(element) { - let position = getComputedStyle(element).position; + console.log("killStickyIfNeeded"); + var position = getComputedStyle(element).position; if (position === 'fixed' || position === 'sticky') { // uBlock exception. if (element.tagName == "IFRAME" && @@ -81,20 +85,69 @@ function killStickyIfNeeded(element) { element.remove(); // Increment the stickies killed count, and update icon badge. - AKS.stickiesKilled++; - chrome.runtime.sendMessage({ newBadgeText: "" + AKS.stickiesKilled }); + incrementKilledStickiesCount(); return true; } else { + var didKillSticky = false; + + // The ::before pseudo-element might be sticky on its own. + position = getComputedStyle(element, "::before").position; + if (position === 'fixed' || position === 'sticky') { + // Kill the sticky. + console.log("Killing sticky!"); + killStickyPseudoElement(element, true); + + // Increment the stickies killed count, and update icon badge. + incrementKilledStickiesCount(); + + didKillSticky = true; + } + + // The ::after pseudo-element, too, might be sticky on its own. + position = getComputedStyle(element, "::after").position; + if (position === 'fixed' || position === 'sticky') { + // Kill the sticky. + console.log("Killing sticky!"); + killStickyPseudoElement(element, false); + + // Increment the stickies killed count, and update icon badge. + incrementKilledStickiesCount(); + + didKillSticky = true; + } + return false; } } +function killStickyPseudoElement(element, before) { + console.log("killStickyPseudoElement"); + if (!AKS.pseudoElementKillingStyleBlock) { + document.querySelector("head").insertAdjacentHTML("beforeend", ""); + AKS.pseudoElementKillingStyleBlock = document.querySelector("style#always-kill-sticky"); + } + + var id = element.id; + if (id == "") + element.id = "always-kill-sticky-killed-element-" + (++AKS.stickyElementIDs); + + let selector = `${element.tagName}#${element.id}::${(before ? 'before' : 'after')}`; + AKS.pseudoElementKillingStyleBlock.innerHTML = AKS.pseudoElementKillingStyleBlock.innerHTML + `${selector} { content: none; }\n`; +} + +function incrementKilledStickiesCount() { + console.log("incrementKilledStickiesCount"); + AKS.stickiesKilled++; + chrome.runtime.sendMessage({ newBadgeText: "" + AKS.stickiesKilled }); +} + /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Full-screen paywalls not only bring up sticky elements, they also make the page un-scrollable. This ensures that the page remains scrollable. */ function restoreScrollability() { + console.log("restoreScrollability"); document.querySelectorAll("html, body").forEach(container => { container.style.setProperty("overflow-y", "auto", "important"); }); @@ -107,6 +160,7 @@ function restoreScrollability() { necessary, killing any newly-formed stickies. */ function startConstantVigilance() { + console.log("startConstantVigilance"); var observer = new MutationObserver((mutationsList, observer) => { window.requestIdleCallback(() => { for (var mutation of mutationsList) { @@ -127,6 +181,7 @@ function startConstantVigilance() { /* Immediately kill all stickies, then commence constant vigilance. */ function beginKillingStickies() { + console.log("beginKillingStickies"); if (!window.AKS) window.AKS = { stickiesKilled: 0 }; window.requestIdleCallback(() => { @@ -140,6 +195,7 @@ function beginKillingStickies() { /******************/ function initialize() { + console.log("initialize"); chrome.storage.local.get([ "matchingPatterns", "exclusionPatterns", "mode" ], (result) => { let shouldKillSticky = checkForShouldKillSticky(result); updateIcon(shouldKillSticky); diff --git a/src/platform/chrome/manifest.json b/src/platform/chrome/manifest.json index f05bc16..cdf0255 100644 --- a/src/platform/chrome/manifest.json +++ b/src/platform/chrome/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "AlwaysKillSticky", - "version": "1.2.8", + "version": "1.2.9", "description": "Get rid of sticky elements on websites - permanently!", "author": "Said Achmiz", "homepage_url": "https://git.sr.ht/~achmizs/AlwaysKillSticky.git", diff --git a/src/platform/firefox/manifest.json b/src/platform/firefox/manifest.json index 2cc800f..4c63210 100644 --- a/src/platform/firefox/manifest.json +++ b/src/platform/firefox/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "AlwaysKillSticky", - "version": "1.2.8", + "version": "1.2.9", "description": "Get rid of sticky elements on websites - permanently!", "author": "Said Achmiz", "browser_specific_settings": {