Fix tracker bar anchoring to action row and stop drift

This commit is contained in:
2026-02-26 00:35:13 +01:00
parent f10d1f5a8d
commit 0511139f99

View File

@@ -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);