diff --git a/src/background/modules/AutoRemoteFollow.js b/src/background/modules/AutoRemoteFollow.js index bc5662a..f4ae2f3 100644 --- a/src/background/modules/AutoRemoteFollow.js +++ b/src/background/modules/AutoRemoteFollow.js @@ -145,12 +145,13 @@ function getInteractionType(url) { } /** - * Handles changes to the URL of a tab + * Handles changes to the URL of a tab. + * @returns {void} */ function onTabUpdate() { browser.tabs.executeScript(null, { - file: `/content_script/mastodonInject.js` - }) + file: "/content_script/mastodonInject.js" + }); } /** diff --git a/src/content_script/mastodonInject.js b/src/content_script/mastodonInject.js index 6d219d3..2bcdabd 100644 --- a/src/content_script/mastodonInject.js +++ b/src/content_script/mastodonInject.js @@ -10,9 +10,9 @@ * @returns {VersionNumber} */ function parseVersionNumber() { - const versionElement = document.querySelector(`.link-footer`).textContent - const versionNumber = versionElement.match(/v?(?\d+)\.(?\d+)\.(?\d+)$/) - return versionNumber.groups + const versionElement = document.querySelector(`.link-footer`).textContent; + const versionNumber = versionElement.match(/v?(?\d+)\.(?\d+)\.(?\d+)$/); + return versionNumber.groups; } @@ -20,81 +20,82 @@ function parseVersionNumber() { * Replacement onClick handler for Follow button * @param {Event} event */ -function onClickFollow (event) { - event.stopPropagation() - event.preventDefault() - const username = window.location.pathname.split(`/`).slice(-1)[0] +function onClickFollow(event) { + event.stopPropagation(); + event.preventDefault(); + const username = window.location.pathname.split(`/`).slice(-1)[0]; // activate AutoRemoteFollow - window.open(`/users/${username}/remote_follow`, `_blank`) + window.open(`/users/${username}/remote_follow`, `_blank`); } /** * wait for element to appear * @param {string} selector * @param {number} timeout + * @see {@link https://github.com/storybookjs/test-runner/blob/6d41927154e8dd1e4c9e7493122e24e2739a7a0f/src/setup-page.ts#L134} from which this was adapted */ -function waitForElement (selector, timeout) { +function waitForElement(selector, timeout) { return new Promise((resolve, reject) => { function getElement() { - return document.querySelector(selector) + return document.querySelector(selector); } - const element = getElement() + const element = getElement(); if(element){ - return resolve(element) + return resolve(element); } const observer = new MutationObserver(() => { - const element = getElement() + const element = getElement(); if(element){ - resolve(element) - observer.disconnect() + resolve(element); + observer.disconnect(); } }) observer.observe(document.body, { childList: true, subtree: true - }) + }); window.setTimeout(() => { - reject() - }, timeout) + reject(); + }, timeout); }) } /** * Inject replacement onClick handler for Follow button */ -async function injectFollowButton () { +async function injectFollowButton() { try { - const followButton = await waitForElement(`.account__header__tabs__buttons button.button`, 20000) - followButton.addEventListener(`click`, onClickFollow) + const followButton = await waitForElement(`.account__header__tabs__buttons button.button`, 20000); + followButton.addEventListener(`click`, onClickFollow); } catch { // Follow button failed to appear } } -async function init () { - let versionNumber +async function init() { + let versionNumber; try { - const initialStateObject = JSON.parse(document.getElementById(`initial-state`).innerHTML) - const version = initialStateObject?.meta?.version + const initialStateObject = JSON.parse(document.getElementById(`initial-state`).innerHTML); + const version = initialStateObject?.meta?.version; if(!initialStateObject || !version){ // not a Mastodon server - return + return; } - versionNumber = parseVersionNumber(version) + versionNumber = parseVersionNumber(version); } catch { return } if(Number.parseInt(versionNumber.major) >= 4){ - await injectFollowButton() + await injectFollowButton(); } } -init() \ No newline at end of file +init(); \ No newline at end of file