From 72e0c8c588cd50b54d4893fcb0a2d29b0ec6cff9 Mon Sep 17 00:00:00 2001 From: marcustyphoon Date: Wed, 10 Jun 2026 04:09:52 -0700 Subject: [PATCH 1/2] replace getAttribute with hasAttribute --- src/features/seen_posts/index.js | 2 +- src/utils/hide_posts.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/seen_posts/index.js b/src/features/seen_posts/index.js index 5adda854df..a3f814e097 100644 --- a/src/features/seen_posts/index.js +++ b/src/features/seen_posts/index.js @@ -61,7 +61,7 @@ const dimPosts = function (postElements, reprocessPosts = false) { const { id } = postElement.dataset; const timelineItem = getTimelineItemWrapper(postElement); - const isFirstRender = timelineItem.getAttribute(excludeAttribute) === null; + const isFirstRender = timelineItem.hasAttribute(excludeAttribute) === false; timelineItem.setAttribute(excludeAttribute, ''); if (seenPosts.includes(id) === false) { diff --git a/src/utils/hide_posts.js b/src/utils/hide_posts.js index e5ca971dd6..20420e67c6 100644 --- a/src/utils/hide_posts.js +++ b/src/utils/hide_posts.js @@ -99,7 +99,7 @@ export const createPostHideFunctions = ({ id, permalinkPageControls }) => { const addPermalinkPageControls = (postElement, timelineElement) => { const timelineItemWrapper = getTimelineItemWrapper(postElement); - if (timelineItemWrapper.getAttribute(controlledHiddenAttribute) !== '') { + if (timelineItemWrapper.hasAttribute(controlledHiddenAttribute) === false) { timelineItemWrapper.setAttribute(controlledHiddenAttribute, ''); const { message } = permalinkPageControls; From 01f682988b3bef09192d6e2eb7d9619d39e2eb81 Mon Sep 17 00:00:00 2001 From: marcustyphoon Date: Wed, 10 Jun 2026 04:17:12 -0700 Subject: [PATCH 2/2] replace setAttribute with toggleAttribute --- src/features/accesskit/disable_gifs.js | 2 +- src/features/anti_capitalism/index.js | 2 +- src/features/classic_footer/index.js | 2 +- src/features/mutual_checker/index.js | 2 +- src/features/no_recommended/hide_blog_carousels.js | 4 ++-- src/features/no_recommended/hide_community_carousels.js | 4 ++-- src/features/no_recommended/hide_radar.js | 2 +- src/features/no_recommended/hide_recommended_blogs.js | 4 ++-- src/features/no_recommended/hide_recommended_blogs_modal.js | 2 +- src/features/no_recommended/hide_recommended_posts.js | 4 ++-- src/features/no_recommended/hide_tag_carousels.js | 4 ++-- src/features/quick_reblog/index.js | 4 ++-- src/features/scroll_to_bottom/index.js | 2 +- src/features/seen_posts/index.js | 4 ++-- src/features/show_originals/index.js | 2 +- src/features/tweaks/caught_up_line.js | 4 ++-- src/features/tweaks/create_button_no_bubbles.js | 2 +- src/features/tweaks/hide_mini_follow.js | 2 +- src/utils/hide_posts.js | 4 ++-- 19 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/features/accesskit/disable_gifs.js b/src/features/accesskit/disable_gifs.js index 6c88065a34..c1c3350bbc 100644 --- a/src/features/accesskit/disable_gifs.js +++ b/src/features/accesskit/disable_gifs.js @@ -257,7 +257,7 @@ const processRows = function (rowsElements) { }; const processHoverableElements = elements => - elements.forEach(element => element.setAttribute(hoverContainerAttribute, '')); + elements.forEach(element => element.toggleAttribute(hoverContainerAttribute, true)); const onStorageChanged = async function (changes) { const { 'accesskit.preferences.disable_gifs_loading_mode': modeChanges } = changes; diff --git a/src/features/anti_capitalism/index.js b/src/features/anti_capitalism/index.js index c626491cbf..ad22e9882c 100644 --- a/src/features/anti_capitalism/index.js +++ b/src/features/anti_capitalism/index.js @@ -12,7 +12,7 @@ export const styleElement = buildStyle(); const processVideoCTAs = videoCTAs => videoCTAs .map(getTimelineItemWrapper) .filter(Boolean) - .forEach(timelineItem => timelineItem.setAttribute(hiddenAttribute, '')); + .forEach(timelineItem => timelineItem.toggleAttribute(hiddenAttribute, true)); export const main = async () => { const { includeBlazed } = await getPreferences('anti_capitalism'); diff --git a/src/features/classic_footer/index.js b/src/features/classic_footer/index.js index 05281ae55b..fc36b143da 100644 --- a/src/features/classic_footer/index.js +++ b/src/features/classic_footer/index.js @@ -284,7 +284,7 @@ const processPosts = (postElements) => postElements.forEach(async postElement => click: onNoteCountClick, }, getButtonChildren(noteCount)); - engagementControls.closest('footer').setAttribute(activeAttribute, ''); + engagementControls.closest('footer').toggleAttribute(activeAttribute, true); engagementControls.before(noteCountButton); if (noReblogMenu) { diff --git a/src/features/mutual_checker/index.js b/src/features/mutual_checker/index.js index a5cd241f1d..b828933f39 100644 --- a/src/features/mutual_checker/index.js +++ b/src/features/mutual_checker/index.js @@ -92,7 +92,7 @@ const addIcons = function (postElements) { const iconTarget = getPopoverWrapper(postAttribution) ?? postAttribution; iconTarget?.before(createIcon(isMutual, blogName)); } else if (showOnlyMutuals) { - getTimelineItemWrapper(postElement)?.setAttribute(hiddenAttribute, ''); + getTimelineItemWrapper(postElement)?.toggleAttribute(hiddenAttribute, true); } }); }; diff --git a/src/features/no_recommended/hide_blog_carousels.js b/src/features/no_recommended/hide_blog_carousels.js index abd1e32797..cb8aa29b97 100644 --- a/src/features/no_recommended/hide_blog_carousels.js +++ b/src/features/no_recommended/hide_blog_carousels.js @@ -22,8 +22,8 @@ const hideBlogCarousels = carousels => timelineItem.previousElementSibling.querySelector(keyToCss('titleObject')) || timelineItem.previousElementSibling.dataset.cellId?.startsWith('timelineObject:title') ) { - timelineItem.setAttribute(hiddenAttribute, ''); - timelineItem.previousElementSibling.setAttribute(hiddenAttribute, ''); + timelineItem.toggleAttribute(hiddenAttribute, true); + timelineItem.previousElementSibling.toggleAttribute(hiddenAttribute, true); } } }); diff --git a/src/features/no_recommended/hide_community_carousels.js b/src/features/no_recommended/hide_community_carousels.js index a8921f1bf5..f3041cc4db 100644 --- a/src/features/no_recommended/hide_community_carousels.js +++ b/src/features/no_recommended/hide_community_carousels.js @@ -22,8 +22,8 @@ const hideCommunityCarousels = carousels => timelineItem.previousElementSibling.querySelector(keyToCss('titleObject')) || timelineItem.previousElementSibling.dataset.cellId?.startsWith('timelineObject:title') ) { - timelineItem.setAttribute(hiddenAttribute, ''); - timelineItem.previousElementSibling.setAttribute(hiddenAttribute, ''); + timelineItem.toggleAttribute(hiddenAttribute, true); + timelineItem.previousElementSibling.toggleAttribute(hiddenAttribute, true); } } }); diff --git a/src/features/no_recommended/hide_radar.js b/src/features/no_recommended/hide_radar.js index 97420ed174..3936d38c26 100644 --- a/src/features/no_recommended/hide_radar.js +++ b/src/features/no_recommended/hide_radar.js @@ -9,7 +9,7 @@ export const styleElement = buildStyle(`[${hiddenAttribute}] { display: none; }` const checkForRadar = function (sidebarTitles) { sidebarTitles .filter(h1 => h1.textContent === translate('Radar')) - .forEach(h1 => h1.closest('aside > *').setAttribute(hiddenAttribute, '')); + .forEach(h1 => h1.closest('aside > *').toggleAttribute(hiddenAttribute, true)); }; export const main = async function () { diff --git a/src/features/no_recommended/hide_recommended_blogs.js b/src/features/no_recommended/hide_recommended_blogs.js index 18355018d8..2741f8bec0 100644 --- a/src/features/no_recommended/hide_recommended_blogs.js +++ b/src/features/no_recommended/hide_recommended_blogs.js @@ -10,13 +10,13 @@ export const styleElement = buildStyle(`[${hiddenAttribute}] { display: none; }` const hideDashboardRecommended = function (sidebarTitles) { sidebarTitles .filter(h1 => h1.textContent === translate('Check out these blogs')) - .forEach(h1 => h1.closest('aside > *').setAttribute(hiddenAttribute, '')); + .forEach(h1 => h1.closest('aside > *').toggleAttribute(hiddenAttribute, true)); }; const hideTagPageRecommended = blogsLists => blogsLists .filter(ul => !ul.matches(blogViewSelector)) - .forEach(ul => ul.parentNode.setAttribute(hiddenAttribute, '')); + .forEach(ul => ul.parentNode.toggleAttribute(hiddenAttribute, true)); export const main = async function () { pageModifications.register('aside h1', hideDashboardRecommended); diff --git a/src/features/no_recommended/hide_recommended_blogs_modal.js b/src/features/no_recommended/hide_recommended_blogs_modal.js index b222f65e8f..ee2726754c 100644 --- a/src/features/no_recommended/hide_recommended_blogs_modal.js +++ b/src/features/no_recommended/hide_recommended_blogs_modal.js @@ -9,7 +9,7 @@ export const styleElement = buildStyle(`[${hiddenAttribute}] { display: none; }` const hideModalRecommended = blogsLists => blogsLists .filter(ul => ul.matches(blogViewSelector)) - .forEach(ul => ul.parentNode.setAttribute(hiddenAttribute, '')); + .forEach(ul => ul.parentNode.toggleAttribute(hiddenAttribute, true)); export const main = async function () { const blogsListSelector = `${keyToCss('desktopContainer')} > ${keyToCss('recommendedBlogs')}`; diff --git a/src/features/no_recommended/hide_recommended_posts.js b/src/features/no_recommended/hide_recommended_posts.js index 8d93347b75..66d2343fe8 100644 --- a/src/features/no_recommended/hide_recommended_posts.js +++ b/src/features/no_recommended/hide_recommended_posts.js @@ -57,10 +57,10 @@ const processPosts = async function (postElements) { const timelineItem = getTimelineItemWrapper(postElement); - timelineItem.setAttribute(hiddenAttribute, ''); + timelineItem.toggleAttribute(hiddenAttribute, true); if (precedingHiddenPosts(timelineItem) >= 10) { - timelineItem.setAttribute(unHiddenAttribute, ''); + timelineItem.toggleAttribute(unHiddenAttribute, true); } }); }; diff --git a/src/features/no_recommended/hide_tag_carousels.js b/src/features/no_recommended/hide_tag_carousels.js index 866730e06a..67d2bed8d1 100644 --- a/src/features/no_recommended/hide_tag_carousels.js +++ b/src/features/no_recommended/hide_tag_carousels.js @@ -18,8 +18,8 @@ const hideTagCarousels = carouselWrappers => carouselWrappers .filter(carouselWrapper => carouselWrapper.querySelector(tagCardSelector) !== null) .map(getTimelineItemWrapper) .forEach(timelineItem => { - timelineItem.setAttribute(hiddenAttribute, ''); - timelineItem.previousElementSibling.setAttribute(hiddenAttribute, ''); + timelineItem.toggleAttribute(hiddenAttribute, true); + timelineItem.previousElementSibling.toggleAttribute(hiddenAttribute, true); }); export const main = async function () { diff --git a/src/features/quick_reblog/index.js b/src/features/quick_reblog/index.js index a760bd5445..5c354d9c38 100644 --- a/src/features/quick_reblog/index.js +++ b/src/features/quick_reblog/index.js @@ -121,13 +121,13 @@ function onTabClick ({ currentTarget }) { previousSelectedTab.ariaSelected = 'false'; previousSelectedTab.getAttribute('aria-controls').split(',') .map(elementId => document.getElementById(elementId)) - .forEach(tabPanel => tabPanel.setAttribute('hidden', '')); + .forEach(tabPanel => tabPanel.toggleAttribute('hidden', true)); } currentTarget.ariaSelected = 'true'; currentTarget.getAttribute('aria-controls').split(',') .map(elementId => document.getElementById(elementId)) - .forEach(tabPanel => tabPanel.removeAttribute('hidden')); + .forEach(tabPanel => tabPanel.toggleAttribute('hidden', false)); } /** @param {KeyboardEvent} event commentInput/tagsInput keydown event object */ diff --git a/src/features/scroll_to_bottom/index.js b/src/features/scroll_to_bottom/index.js index 58b38f64b1..951024777f 100644 --- a/src/features/scroll_to_bottom/index.js +++ b/src/features/scroll_to_bottom/index.js @@ -78,7 +78,7 @@ const addButtonToPage = async function ([scrollToTopButton]) { scrollToBottomButton.style.transform = 'rotate(180deg)'; scrollToBottomButton.addEventListener('click', onclick); scrollToBottomButton.id = scrollToBottomButtonId; - scrollToBottomButton.setAttribute(displayBlockUnlessDisabledAttr, ''); + scrollToBottomButton.toggleAttribute(displayBlockUnlessDisabledAttr, true); scrollToBottomButton.classList.toggle(activeClass, active); } diff --git a/src/features/seen_posts/index.js b/src/features/seen_posts/index.js index a3f814e097..f22d9b745a 100644 --- a/src/features/seen_posts/index.js +++ b/src/features/seen_posts/index.js @@ -62,12 +62,12 @@ const dimPosts = function (postElements, reprocessPosts = false) { const timelineItem = getTimelineItemWrapper(postElement); const isFirstRender = timelineItem.hasAttribute(excludeAttribute) === false; - timelineItem.setAttribute(excludeAttribute, ''); + timelineItem.toggleAttribute(excludeAttribute, true); if (seenPosts.includes(id) === false) { observer.observe(postElement.querySelector('article header + *')); } else if (isFirstRender || reprocessPosts) { - timelineItem.setAttribute(dimAttribute, ''); + timelineItem.toggleAttribute(dimAttribute, true); } } }; diff --git a/src/features/show_originals/index.js b/src/features/show_originals/index.js index 5a2fb49bda..b80b7c3491 100644 --- a/src/features/show_originals/index.js +++ b/src/features/show_originals/index.js @@ -115,7 +115,7 @@ const processPosts = async function (postElements) { const visibleBlogName = community ? postAuthor : blogName; if (whitelist.includes(visibleBlogName)) { return; } - getTimelineItemWrapper(postElement).setAttribute(hiddenAttribute, ''); + getTimelineItemWrapper(postElement).toggleAttribute(hiddenAttribute, true); }); }; diff --git a/src/features/tweaks/caught_up_line.js b/src/features/tweaks/caught_up_line.js index 353088fdf3..0b0101e672 100644 --- a/src/features/tweaks/caught_up_line.js +++ b/src/features/tweaks/caught_up_line.js @@ -34,8 +34,8 @@ const createCaughtUpLine = tagChicletCarouselItems => tagChicletCarouselItems .map(getTimelineItemWrapper) .filter((element, index, array) => array.indexOf(element) === index) .forEach(timelineItem => { - timelineItem.setAttribute(borderAttribute, ''); - timelineItem.previousElementSibling.setAttribute(hiddenAttribute, ''); + timelineItem.toggleAttribute(borderAttribute, true); + timelineItem.previousElementSibling.toggleAttribute(hiddenAttribute, true); }); export const main = async function () { diff --git a/src/features/tweaks/create_button_no_bubbles.js b/src/features/tweaks/create_button_no_bubbles.js index b8de419efd..5b00d1aa73 100644 --- a/src/features/tweaks/create_button_no_bubbles.js +++ b/src/features/tweaks/create_button_no_bubbles.js @@ -12,7 +12,7 @@ const processCreateButtons = (createButtons) => { createButtons.forEach(createButton => { createButton.dataset.originalHref ??= createButton.getAttribute('href'); - createButton.setAttribute(modifiedAttribute, ''); + createButton.toggleAttribute(modifiedAttribute, true); createButton.setAttribute('href', createButton.dataset.originalHref.replace(/\/new$/, '/new/text')); createButton.addEventListener('click', onClickNavigate); }); diff --git a/src/features/tweaks/hide_mini_follow.js b/src/features/tweaks/hide_mini_follow.js index eb9e1acace..7f12cf2159 100644 --- a/src/features/tweaks/hide_mini_follow.js +++ b/src/features/tweaks/hide_mini_follow.js @@ -11,7 +11,7 @@ article ${keyToCss('followButton')}:not(${keyToCss('postMeatballsContainer')} *) const processButtons = buttons => buttons.forEach(button => { if (button.textContent === translate('Follow')) { - button.setAttribute(hiddenAttribute, ''); + button.toggleAttribute(hiddenAttribute, true); } }); diff --git a/src/utils/hide_posts.js b/src/utils/hide_posts.js index 20420e67c6..a950fea01d 100644 --- a/src/utils/hide_posts.js +++ b/src/utils/hide_posts.js @@ -100,7 +100,7 @@ export const createPostHideFunctions = ({ id, permalinkPageControls }) => { const addPermalinkPageControls = (postElement, timelineElement) => { const timelineItemWrapper = getTimelineItemWrapper(postElement); if (timelineItemWrapper.hasAttribute(controlledHiddenAttribute) === false) { - timelineItemWrapper.setAttribute(controlledHiddenAttribute, ''); + timelineItemWrapper.toggleAttribute(controlledHiddenAttribute, true); const { message } = permalinkPageControls; const controlsElement = div({ class: controlsClass, [controlsAttribute]: id }, [ @@ -122,7 +122,7 @@ export const createPostHideFunctions = ({ id, permalinkPageControls }) => { // do nothing; avoid hiding single post and making permalink page look broken } } else { - getTimelineItemWrapper(postElement).setAttribute(hiddenAttribute, ''); + getTimelineItemWrapper(postElement).toggleAttribute(hiddenAttribute, true); } }; const showPost = postElement => {