# HG changeset patch # User nanaya # Date 1674238526 -32400 # Node ID a701294f38ff3f4dd63aa583566f9ad23ae939c3 # Parent bf1f7164fd4fa4c997080b9a6b4ed23f57adc6a7 More reliable state handling diff -r bf1f7164fd4f -r a701294f38ff twitter-default-following-tab.user.js --- a/twitter-default-following-tab.user.js Sat Jan 21 02:30:07 2023 +0900 +++ b/twitter-default-following-tab.user.js Sat Jan 21 03:15:26 2023 +0900 @@ -1,13 +1,11 @@ // ==UserScript== // @name twitter default following tab // @namespace https://nanaya.net -// @match https://mobile.twitter.com/ -// @match https://mobile.twitter.com/home -// @match https://twitter.com/ -// @match https://twitter.com/home +// @match https://mobile.twitter.com/* +// @match https://twitter.com/* // @grant none -// @run-at document-end -// @version 1.0.3 +// @run-at document-start +// @version 1.1.0 // @author nanaya // @description Always select Following tab on first load // @downloadURL https://hg.nanaya.net/ec-userscripts/raw-file/tip/twitter-default-following-tab.user.js @@ -17,36 +15,48 @@ 'use strict'; let selected = false; +let observing = true; -const observer = new window.MutationObserver(selectFollowingTab); -let stopObservingTimeout; +function isHome () { + return window.location.pathname === '/home'; +} + +let resumeObserverTimeout; +// prevent reselect on browser back/forward navigation +function pauseObserver () { + console.debug('pausing observer'); + observing = false; + clearTimeout(resumeObserverTimeout); + resumeObserverTimeout = setTimeout(() => { + console.debug('resuming observer'); + observing = true; + selected = isHome(); + }, 1000); +} function selectFollowingTab () { + if (!observing) return; + + if (!isHome()) { + selected = false; + return; + } + if (selected) return; const followingTab = document.querySelectorAll('[href="/home"][role=tab]')?.[1]; - if (followingTab == null || followingTab.getAttribute('aria-selected') === 'true') return; + if (followingTab == null) return; - console.log("selecting 'Following' tab"); + if (followingTab.getAttribute('aria-selected') === 'true') { + selected = true; + return; + } + + console.log('selecting "Following" tab'); selected = true; followingTab.click(); - observer.disconnect(); - clearTimeout(stopObservingTimeout); } -function init () { - selectFollowingTab(); - if (!selected) { - observer.observe(document, { childList: true, subtree: true }); - } - stopObservingTimeout = setTimeout(() => { - console.log("couldn't find 'Following' tab, stop observing page"); - observer.disconnect(); - }, 60000); -} - -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', init); -} else { - init(); -} +new window.MutationObserver(selectFollowingTab).observe(document, { childList: true, subtree: true }); +selectFollowingTab(); +window.addEventListener('popstate', pauseObserver);