Fix tracker bar anchoring to action row and stop drift
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user