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)
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user