mirror of
https://github.com/meowarex/TidaLuna-Plugins.git
synced 2026-06-17 19:33:10 +10:00
Fixed Element hider counter leak
This commit is contained in:
@@ -19,7 +19,13 @@ new StyleTag("Element-Hider", unloads, styles);
|
|||||||
// State management
|
// State management
|
||||||
let targetElement: HTMLElement | null = null;
|
let targetElement: HTMLElement | null = null;
|
||||||
let hiddenElements = new WeakSet<HTMLElement>();
|
let hiddenElements = new WeakSet<HTMLElement>();
|
||||||
let hiddenElementsArray: HTMLElement[] = [];
|
|
||||||
|
// Count of elements currently hidden in the live DOM. The `.element-hider-hidden`
|
||||||
|
// class is the source of truth — querying it avoids retaining detached nodes
|
||||||
|
// across SPA navigations.
|
||||||
|
function getHiddenCount(): number {
|
||||||
|
return document.querySelectorAll(".element-hider-hidden").length;
|
||||||
|
}
|
||||||
|
|
||||||
// MutationObserver for reactive element detection
|
// MutationObserver for reactive element detection
|
||||||
let elementObserver: MutationObserver | null = null;
|
let elementObserver: MutationObserver | null = null;
|
||||||
@@ -179,7 +185,6 @@ function hideElementDirectly(element: HTMLElement): void {
|
|||||||
|
|
||||||
element.classList.add("element-hider-hidden");
|
element.classList.add("element-hider-hidden");
|
||||||
hiddenElements.add(element);
|
hiddenElements.add(element);
|
||||||
hiddenElementsArray.push(element);
|
|
||||||
trace.log(
|
trace.log(
|
||||||
`Hidden element: ${element.tagName}${element.className ? "." + element.className.split(" ")[0] : ""}`,
|
`Hidden element: ${element.tagName}${element.className ? "." + element.className.split(" ")[0] : ""}`,
|
||||||
);
|
);
|
||||||
@@ -210,7 +215,6 @@ function hideTargetElement(): void {
|
|||||||
"element-hider-target",
|
"element-hider-target",
|
||||||
);
|
);
|
||||||
hiddenElements.add(elementToHide);
|
hiddenElements.add(elementToHide);
|
||||||
hiddenElementsArray.push(elementToHide);
|
|
||||||
}, 300);
|
}, 300);
|
||||||
|
|
||||||
// Clear target reference
|
// Clear target reference
|
||||||
@@ -220,20 +224,19 @@ function hideTargetElement(): void {
|
|||||||
// Unhide all elements permanently (remove from storage)
|
// Unhide all elements permanently (remove from storage)
|
||||||
function unhideAllElements(): void {
|
function unhideAllElements(): void {
|
||||||
trace.log(
|
trace.log(
|
||||||
`Permanently unhiding ${settings.hiddenElements.length} saved elements`,
|
`Permanently unhiding ${settings.hiddenElements.length} saved selectors`,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Show all currently hidden elements
|
// Show all currently hidden elements
|
||||||
hiddenElementsArray.forEach((element) => {
|
document
|
||||||
if (document.body.contains(element)) {
|
.querySelectorAll(".element-hider-hidden, .element-hider-hiding")
|
||||||
|
.forEach((element) => {
|
||||||
element.classList.remove("element-hider-hidden", "element-hider-hiding");
|
element.classList.remove("element-hider-hidden", "element-hider-hiding");
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// Clear both storage and runtime collections
|
// Clear both storage and runtime collections
|
||||||
settings.hiddenElements = [];
|
settings.hiddenElements = [];
|
||||||
hiddenElements = new WeakSet<HTMLElement>();
|
hiddenElements = new WeakSet<HTMLElement>();
|
||||||
hiddenElementsArray = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process all elements in the document to hide matching ones (with strict matching)
|
// Process all elements in the document to hide matching ones (with strict matching)
|
||||||
@@ -334,7 +337,7 @@ window.showAllElementsFromSettings = unhideAllElements;
|
|||||||
window.debugElementHider = () => {
|
window.debugElementHider = () => {
|
||||||
trace.log(`=== Element Hider Debug Info ===`);
|
trace.log(`=== Element Hider Debug Info ===`);
|
||||||
trace.log(`Stored elements: ${settings.hiddenElements.length}`);
|
trace.log(`Stored elements: ${settings.hiddenElements.length}`);
|
||||||
trace.log(`Currently hidden elements: ${hiddenElementsArray.length}`);
|
trace.log(`Currently hidden elements: ${getHiddenCount()}`);
|
||||||
trace.log(`Reactive hiding enabled: true`);
|
trace.log(`Reactive hiding enabled: true`);
|
||||||
settings.hiddenElements.forEach((element, index) => {
|
settings.hiddenElements.forEach((element, index) => {
|
||||||
trace.log(`${index + 1}. ${element.selector} (${element.tagName})`);
|
trace.log(`${index + 1}. ${element.selector} (${element.tagName})`);
|
||||||
@@ -472,7 +475,7 @@ function createCustomMenu(): HTMLElement {
|
|||||||
// Unhide All Elements option
|
// Unhide All Elements option
|
||||||
const unhideAllItem = document.createElement("button");
|
const unhideAllItem = document.createElement("button");
|
||||||
unhideAllItem.className = "element-hider-menu-item";
|
unhideAllItem.className = "element-hider-menu-item";
|
||||||
unhideAllItem.innerHTML = `Unhide All Elements (${hiddenElementsArray.length})`;
|
unhideAllItem.innerHTML = `Unhide All Elements (${getHiddenCount()})`;
|
||||||
unhideAllItem.addEventListener("click", () => {
|
unhideAllItem.addEventListener("click", () => {
|
||||||
unhideAllElements();
|
unhideAllElements();
|
||||||
closeCustomMenu();
|
closeCustomMenu();
|
||||||
@@ -593,7 +596,7 @@ function addElementHiderOptions(contextMenu: HTMLElement): void {
|
|||||||
const unhideAllButton = document.createElement("button");
|
const unhideAllButton = document.createElement("button");
|
||||||
unhideAllButton.className = "element-hider-menu-item";
|
unhideAllButton.className = "element-hider-menu-item";
|
||||||
unhideAllButton.style.cssText = hideButton.style.cssText;
|
unhideAllButton.style.cssText = hideButton.style.cssText;
|
||||||
unhideAllButton.innerHTML = `Unhide All Elements (${hiddenElementsArray.length})`;
|
unhideAllButton.innerHTML = `Unhide All Elements (${getHiddenCount()})`;
|
||||||
|
|
||||||
unhideAllButton.addEventListener("click", unhideAllElements);
|
unhideAllButton.addEventListener("click", unhideAllElements);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user