From 0511139f99f1dee3637121a7883757f1bda5499e Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 26 Feb 2026 00:35:13 +0100 Subject: [PATCH] Fix tracker bar anchoring to action row and stop drift --- extension/content.js | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/extension/content.js b/extension/content.js index ab6e3f5..152bb3a 100644 --- a/extension/content.js +++ b/extension/content.js @@ -265,7 +265,7 @@ function dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, preferredTracker = n const keep = preferredTracker && trackers.includes(preferredTracker) ? preferredTracker - : trackers[trackers.length - 1]; + : trackers[0]; trackers.forEach((tracker) => { if (tracker !== keep) { @@ -276,6 +276,26 @@ function dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, preferredTracker = n return keep; } +function getTrackerHostElement(trackerElement) { + if (!trackerElement) { + return null; + } + + const rawHost = trackerElement.closest('div[aria-posinset], article[role="article"], article, div[role="complementary"]'); + return rawHost ? ensurePrimaryPostElement(rawHost) : null; +} + +function isTrackerInsertionMarkerLocked(marker) { + return Boolean(marker && marker.dataset && marker.dataset.anchorLocked === '1'); +} + +function setTrackerInsertionMarkerLocked(marker, locked) { + if (!marker || !marker.dataset) { + return; + } + marker.dataset.anchorLocked = locked ? '1' : '0'; +} + function getTrackerInsertionAnchorInPost(postElement, buttonBar) { if (!postElement || !buttonBar || !postElement.contains(buttonBar)) { return null; @@ -412,6 +432,7 @@ function createTrackerInsertionMarker() { const marker = document.createElement('div'); marker.className = 'fb-tracker-insertion-anchor'; marker.setAttribute('aria-hidden', 'true'); + setTrackerInsertionMarkerLocked(marker, false); marker.style.cssText = ` display: block; width: 100%; @@ -431,25 +452,28 @@ function positionTrackerInsertionMarker(postElement, marker, buttonBar, postNum const resolvedButtonBar = resolveActionButtonBar(postElement, buttonBar); const actionAnchor = getDirectActionAnchorInPost(postElement, resolvedButtonBar); - const sortAnchor = findAdjacentCommentSortAnchor(postElement, actionAnchor); - const preferredAnchor = sortAnchor || actionAnchor; + const preferredAnchor = actionAnchor; if (preferredAnchor && preferredAnchor.parentElement) { preferredAnchor.parentElement.insertBefore(marker, preferredAnchor.nextSibling); + setTrackerInsertionMarkerLocked(marker, true); return true; } if (resolvedButtonBar && resolvedButtonBar.parentElement && postElement.contains(resolvedButtonBar.parentElement)) { resolvedButtonBar.parentElement.insertBefore(marker, resolvedButtonBar.nextSibling); + setTrackerInsertionMarkerLocked(marker, true); return true; } if (buttonBar && buttonBar.parentElement && buttonBar.parentElement.parentElement && !postElement.contains(buttonBar.parentElement.parentElement)) { buttonBar.parentElement.parentElement.insertBefore(marker, buttonBar.parentElement.nextSibling); + setTrackerInsertionMarkerLocked(marker, false); return true; } postElement.appendChild(marker); + setTrackerInsertionMarkerLocked(marker, false); console.log('[FB Tracker] Post #' + postNum + ' - Marker fallback appended to post'); return true; } @@ -474,6 +498,11 @@ function ensureTrackerInsertionMarker(postElement, buttonBar, postNum = '?') { marker = createTrackerInsertionMarker(); } + if (marker.isConnected && postElement.contains(marker) && isTrackerInsertionMarkerLocked(marker)) { + setTrackerAnchorForPost(postElement, marker); + return marker; + } + const positioned = positionTrackerInsertionMarker(postElement, marker, buttonBar, postNum); if (!positioned || !marker.isConnected) { clearTrackerAnchorForPost(postElement, marker); @@ -3388,6 +3417,12 @@ async function createTrackerUI(postElement, buttonBar, postNum = '?', options = if (existingScopedTrackers.length > 0) { const scopedTracker = dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, existingScopedTrackers[0]); if (scopedTracker) { + const trackerHost = getTrackerHostElement(scopedTracker); + if (trackerHost && trackerHost !== postElement) { + console.log('[FB Tracker] Post #' + postNum + ' - Reusing tracker skipped (different host container)'); + postElement.setAttribute(PROCESSED_ATTR, '1'); + return; + } const marker = ensureTrackerInsertionMarker(postElement, buttonBar, postNum); if (marker) { insertTrackerAtMarker(marker, scopedTracker);