diff options
Diffstat (limited to 'src/assets/javascripts/twitter.js')
-rw-r--r-- | src/assets/javascripts/twitter.js | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js new file mode 100644 index 00000000..d03c269f --- /dev/null +++ b/src/assets/javascripts/twitter.js @@ -0,0 +1,241 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}(www\.|mobile\.|)twitter\.com/, + /^https?:\/{2}(pbs\.|video\.|)twimg\.com/, + /^https?:\/{2}platform\.twitter\.com\/embed/, + /^https?:\/{2}t\.co/ +]; + +let redirects = { + "nitter": { + "normal": [], + "tor": [] + }, +}; + +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.nitter = val; + nitterNormalRedirectsChecks = [...redirects.nitter.normal]; + for (const instance of r.cloudflareList) { + let i = nitterNormalRedirectsChecks.indexOf(instance); + if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); + } + browser.storage.local.set({ + twitterRedirects: redirects, + nitterNormalRedirectsChecks, + nitterTorRedirectsChecks: [...redirects.nitter.tor] + }) + }) +} + +let + disableTwitter, + twitterProtocol, + twitterRedirects, + nitterNormalRedirectsChecks, + nitterNormalCustomRedirects, + nitterTorRedirectsChecks, + nitterTorCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableTwitter", + "twitterProtocol", + "twitterRedirects", + "nitterNormalRedirectsChecks", + "nitterNormalCustomRedirects", + "nitterTorRedirectsChecks", + "nitterTorCustomRedirects", + ], + r => { + disableTwitter = r.disableTwitter; + twitterProtocol = r.twitterProtocol; + twitterRedirects = r.twitterRedirects; + nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks; + nitterNormalCustomRedirects = r.nitterNormalCustomRedirects; + nitterTorRedirectsChecks = r.nitterTorRedirectsChecks; + nitterTorCustomRedirects = r.nitterTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...nitterNormalRedirectsChecks, + ...nitterTorRedirectsChecks, + ...nitterNormalCustomRedirects, + ...nitterTorCustomRedirects, + ]; +} + +function redirect(url, initiator) { + if (disableTwitter) return; + if (!targets.some(rx => rx.test(url.href))) return; + if (url.pathname.split("/").includes("home")) return; + if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; + + let instancesList; + if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; + else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + // https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg + if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") + return `${randomInstance}/pic/${encodeURIComponent(`${url.host}${url.pathname}`)}`; + else if (url.pathname.split("/").includes("tweets")) + return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`; + else if (url.host == 't.co') + return `${randomInstance}/t.co${url.pathname}`; + else + return `${randomInstance}${url.pathname}${url.search}`; +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + resolve(`https://twitter.com${url.pathname}${url.search}`); + }) +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + let instancesList; + if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; + else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; + + let index = instancesList.indexOf(protocolHost); + if (index > -1) instancesList.splice(index, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function removeXFrameOptions(e) { + let url = new URL(e.url); + let protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost) || e.type != 'sub_frame') return; + let isChanged = false; + for (const i in e.responseHeaders) if (e.responseHeaders[i].name == 'x-frame-options') { + e.responseHeaders.splice(i, 1); + isChanged = true; + } + if (isChanged) return { responseHeaders: e.responseHeaders }; +} + +function initNitterCookies(test, from) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(from); + if (!all().includes(protocolHost) + ) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] + else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] + for (const to of checkedInstances) { + utils.copyCookie('nitter', from, to, 'theme'); + utils.copyCookie('nitter', from, to, 'infiniteScroll'); + utils.copyCookie('nitter', from, to, 'stickyProfile'); + utils.copyCookie('nitter', from, to, 'bidiSupport'); + utils.copyCookie('nitter', from, to, 'hideTweetStats'); + utils.copyCookie('nitter', from, to, 'hideBanner'); + utils.copyCookie('nitter', from, to, 'hidePins'); + utils.copyCookie('nitter', from, to, 'hideReplies'); + utils.copyCookie('nitter', from, to, 'squareAvatars'); + utils.copyCookie('nitter', from, to, 'mp4Playback'); + utils.copyCookie('nitter', from, to, 'hlsPlayback'); + utils.copyCookie('nitter', from, to, 'proxyVideos'); + utils.copyCookie('nitter', from, to, 'muteVideos'); + utils.copyCookie('nitter', from, to, 'autoplayGifs'); + } + } + resolve(true); + }) +} + +function setNitterCookies() { + return new Promise(async resolve => { + await init(); + if (disableTwitter || twitterProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] + else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('nitter', to, 'theme'); + utils.getCookiesFromStorage('nitter', to, 'infiniteScroll'); + utils.getCookiesFromStorage('nitter', to, 'stickyProfile'); + utils.getCookiesFromStorage('nitter', to, 'bidiSupport'); + utils.getCookiesFromStorage('nitter', to, 'hideTweetStats'); + utils.getCookiesFromStorage('nitter', to, 'hideBanner'); + utils.getCookiesFromStorage('nitter', to, 'hidePins'); + utils.getCookiesFromStorage('nitter', to, 'hideReplies'); + utils.getCookiesFromStorage('nitter', to, 'squareAvatars'); + utils.getCookiesFromStorage('nitter', to, 'mp4Playback'); + utils.getCookiesFromStorage('nitter', to, 'hlsPlayback'); + utils.getCookiesFromStorage('nitter', to, 'proxyVideos'); + utils.getCookiesFromStorage('nitter', to, 'muteVideos'); + utils.getCookiesFromStorage('nitter', to, 'autoplayGifs'); + } + resolve(); + } + ) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(data => { + let dataJson = JSON.parse(data); + redirects.nitter = dataJson.nitter; + browser.storage.local.get('cloudflareList', async r => { + nitterNormalRedirectsChecks = [...redirects.nitter.normal]; + for (const instance of r.cloudflareList) { + let i = nitterNormalRedirectsChecks.indexOf(instance); + if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableTwitter: false, + twitterRedirects: redirects, + twitterProtocol: "normal", + + nitterNormalRedirectsChecks, + nitterNormalCustomRedirects: [], + + nitterTorRedirectsChecks: [...redirects.nitter.tor], + nitterTorCustomRedirects: [], + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + redirect, + switchInstance, + reverse, + removeXFrameOptions, + initNitterCookies, + setNitterCookies, + initDefaults, +}; |