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) const keep = preferredTracker && trackers.includes(preferredTracker)
? preferredTracker ? preferredTracker
: trackers[trackers.length - 1]; : trackers[0];
trackers.forEach((tracker) => { trackers.forEach((tracker) => {
if (tracker !== keep) { if (tracker !== keep) {
@@ -276,6 +276,26 @@ function dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, preferredTracker = n
return keep; 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) { function getTrackerInsertionAnchorInPost(postElement, buttonBar) {
if (!postElement || !buttonBar || !postElement.contains(buttonBar)) { if (!postElement || !buttonBar || !postElement.contains(buttonBar)) {
return null; return null;
@@ -412,6 +432,7 @@ function createTrackerInsertionMarker() {
const marker = document.createElement('div'); const marker = document.createElement('div');
marker.className = 'fb-tracker-insertion-anchor'; marker.className = 'fb-tracker-insertion-anchor';
marker.setAttribute('aria-hidden', 'true'); marker.setAttribute('aria-hidden', 'true');
setTrackerInsertionMarkerLocked(marker, false);
marker.style.cssText = ` marker.style.cssText = `
display: block; display: block;
width: 100%; width: 100%;
@@ -431,25 +452,28 @@ function positionTrackerInsertionMarker(postElement, marker, buttonBar, postNum
const resolvedButtonBar = resolveActionButtonBar(postElement, buttonBar); const resolvedButtonBar = resolveActionButtonBar(postElement, buttonBar);
const actionAnchor = getDirectActionAnchorInPost(postElement, resolvedButtonBar); const actionAnchor = getDirectActionAnchorInPost(postElement, resolvedButtonBar);
const sortAnchor = findAdjacentCommentSortAnchor(postElement, actionAnchor); const preferredAnchor = actionAnchor;
const preferredAnchor = sortAnchor || actionAnchor;
if (preferredAnchor && preferredAnchor.parentElement) { if (preferredAnchor && preferredAnchor.parentElement) {
preferredAnchor.parentElement.insertBefore(marker, preferredAnchor.nextSibling); preferredAnchor.parentElement.insertBefore(marker, preferredAnchor.nextSibling);
setTrackerInsertionMarkerLocked(marker, true);
return true; return true;
} }
if (resolvedButtonBar && resolvedButtonBar.parentElement && postElement.contains(resolvedButtonBar.parentElement)) { if (resolvedButtonBar && resolvedButtonBar.parentElement && postElement.contains(resolvedButtonBar.parentElement)) {
resolvedButtonBar.parentElement.insertBefore(marker, resolvedButtonBar.nextSibling); resolvedButtonBar.parentElement.insertBefore(marker, resolvedButtonBar.nextSibling);
setTrackerInsertionMarkerLocked(marker, true);
return true; return true;
} }
if (buttonBar && buttonBar.parentElement && buttonBar.parentElement.parentElement && !postElement.contains(buttonBar.parentElement.parentElement)) { if (buttonBar && buttonBar.parentElement && buttonBar.parentElement.parentElement && !postElement.contains(buttonBar.parentElement.parentElement)) {
buttonBar.parentElement.parentElement.insertBefore(marker, buttonBar.parentElement.nextSibling); buttonBar.parentElement.parentElement.insertBefore(marker, buttonBar.parentElement.nextSibling);
setTrackerInsertionMarkerLocked(marker, false);
return true; return true;
} }
postElement.appendChild(marker); postElement.appendChild(marker);
setTrackerInsertionMarkerLocked(marker, false);
console.log('[FB Tracker] Post #' + postNum + ' - Marker fallback appended to post'); console.log('[FB Tracker] Post #' + postNum + ' - Marker fallback appended to post');
return true; return true;
} }
@@ -474,6 +498,11 @@ function ensureTrackerInsertionMarker(postElement, buttonBar, postNum = '?') {
marker = createTrackerInsertionMarker(); marker = createTrackerInsertionMarker();
} }
if (marker.isConnected && postElement.contains(marker) && isTrackerInsertionMarkerLocked(marker)) {
setTrackerAnchorForPost(postElement, marker);
return marker;
}
const positioned = positionTrackerInsertionMarker(postElement, marker, buttonBar, postNum); const positioned = positionTrackerInsertionMarker(postElement, marker, buttonBar, postNum);
if (!positioned || !marker.isConnected) { if (!positioned || !marker.isConnected) {
clearTrackerAnchorForPost(postElement, marker); clearTrackerAnchorForPost(postElement, marker);
@@ -3388,6 +3417,12 @@ async function createTrackerUI(postElement, buttonBar, postNum = '?', options =
if (existingScopedTrackers.length > 0) { if (existingScopedTrackers.length > 0) {
const scopedTracker = dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, existingScopedTrackers[0]); const scopedTracker = dedupeTrackersForUrlInScope(encodedUrl, scopeRoot, existingScopedTrackers[0]);
if (scopedTracker) { 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); const marker = ensureTrackerInsertionMarker(postElement, buttonBar, postNum);
if (marker) { if (marker) {
insertTrackerAtMarker(marker, scopedTracker); insertTrackerAtMarker(marker, scopedTracker);