Last active
December 30, 2023 01:00
-
-
Save awsr/24a3cec8d34aca2c5cadf6e60fef9e37 to your computer and use it in GitHub Desktop.
Restore Twitter branding. (Works best with the Old Twitter Layout extension)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name ReTwitterize | |
// @version 2.1.0 | |
// @namespace https://gist.github.com/awsr | |
// @description Because Elon Musk is an idiot | |
// @author awsr | |
// @match https://twitter.com/* | |
// @match https://x.com/* | |
// @downloadURL https://gist.github.com/awsr/24a3cec8d34aca2c5cadf6e60fef9e37/raw/retwitterize.user.js | |
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4T2NkoBAwUqifAW7Au3fv+IWEhD6iGwgSn3/jY+KnXz8EFfg57icaKi4AiYHUgdTDDfBfdXpjgKrIepACZEMMZh65cOE3hz4DEwsDw++fDA78vw88+PxLscZWpSnFQG4e3AD77Y9PHbz1zDRBnn1Bn51cAcj080/eGxge+HKegYMbYebXjwwCXFxfDjpy+euL8O6DG7Dg7te6hPM/Gxk+vGLgf/fwfaCa+EY+Pvavk96JZ6N7a505d2WgDNsURkbGLwgXrLl+9CCDuBVY8d8/DAyf30FoYSmMcP4fLCgK1PwGJAE34MKrb2EOR7/P/fCXkQdfzBjyM98578qvClMDN+D///88dZe/TZ5890cIPkPm6LM2pajy1mMYABLY//RDeOGVPy0XPjOpYHMFyPZzLny2QOe/wGoA0BX8Z9/88m659Stjw/PftsiGgDQfcuBL4WVlPIgsDvYCKGEUHXo0Yf31p/4fmTgEGcTkGBh4heHq4uXZt08x4OrkYWE4ArT9L4YBQJuZgYKqF97+tVj34qcjTIE8J8sLZzGGcwo8bBeBYrfRNaPEAogDCkgghbCageEnkP8eqBFEYwXUy0z44h6fHAAkJ6sRJxhsYgAAAABJRU5ErkJggg== | |
// @grant window.onurlchange | |
// @run-at document-body | |
// ==/UserScript== | |
(function () { | |
'use strict'; | |
const logoWatchConfig = { childList: true, subtree: true, attributes: true, attributeFilter: ["style", "fill", "d"] }; | |
const linkWatchConfig = { attributes: true, attributeFilter: ["href"] }; | |
const getManifest = () => document.head.querySelector('link[rel="manifest"]'); | |
const getSearch = () => document.head.querySelector('link[rel="search"]'); | |
const logoWatcher = new MutationObserver(modifyPageLogo); | |
const linkWatcher = new MutationObserver(modifyLinks); | |
const manifestWatcher = new MutationObserver(modifyManifest); | |
const searchWatcher = new MutationObserver(modifyOpenSearch); | |
const elementSet = new Set(); | |
const processedLinks = new Set(); | |
let loaderLoop = -1; | |
let manifestError = false; | |
const RunFlags = () => { | |
return { | |
link: true, | |
manifest: true, | |
search: true, | |
logo: true | |
} | |
} | |
// ======================================== | |
// DEFINITIONS | |
// ======================================== | |
const manifestData = "data:application/manifest+json," + encodeURIComponent(`{"background_color":"#ffffff","categories":["social","news","magazines"],"description":"Get breaking news, politics, trending music, world events, sports scores, and the latest global news stories as they unfold - all with less data.","display":"standalone","gcm_sender_id":"49625052041","gcm_user_visible_only":true,"icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-default.ee534d8a.png","sizes":"192x192","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/icon-default-large.8e027b6a.png","sizes":"512x512","type":"image/png"},{"purpose":"maskable","src":"https://abs.twimg.com/responsive-web/client-web/icon-default-maskable.2fd29c8a.png","sizes":"192x192","type":"image/png"},{"purpose":"maskable","src":"https://abs.twimg.com/responsive-web/client-web/icon-default-maskable-large.ee2b7aaa.png","sizes":"512x512","type":"image/png"}],"name":"Twitter","screenshots":[{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-data-saver-marketing.6805986a.png","sizes":"586x1041","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-explore-marketing.fd45b02a.png","sizes":"586x1041","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-timeline-marketing.befcdb4a.png","sizes":"586x1041","type":"image/png"}],"share_target":{"action":"https://twitter.com/compose/tweet","enctype":"multipart/form-data","method":"POST","params":{"title":"title","text":"text","url":"url","files":[{"name":"externalMedia","accept":["image/jpeg","image/png","image/gif","video/quicktime","video/mp4"]}]}},"shortcuts":[{"name":"New Tweet","url":"https://twitter.com/compose/tweet?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-compose.1238442a.png","type":"image/png","sizes":"192x192"}]},{"name":"Explore","url":"https://twitter.com/explore?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-search-stroke.5f9aa88a.png","type":"image/png","sizes":"192x192"}]},{"name":"Notifications","url":"https://twitter.com/notifications?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-notifications-stroke.429602da.png","type":"image/png","sizes":"192x192"}]},{"name":"Direct Messages","url":"https://twitter.com/messages?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-messages-stroke.5f95edca.png","type":"image/png","sizes":"192x192"}]}],"short_name":"Twitter","start_url":"https://twitter.com/?utm_source=homescreen&utm_medium=shortcut","theme_color":"#ffffff","scope":"https://twitter.com/","android_package_name":"com.twitter.android","prefer_related_applications":true,"related_applications":[{"id":"com.twitter.android","platform":"chromeos_play","url":"https://play.google.com/store/apps/details?id=com.twitter.android"}],"launch_handler":{"route_to":"existing-client","navigate_existing_client":"never"}}`); | |
const openSearchData = "data:text/xml;charset=utf-8," + encodeURIComponent(`<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/"><ShortName>Twitter</ShortName><Description>Twitter Search</Description><Url type="text/html" method="get" template="https://twitter.com/search?q={searchTerms}"/><Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoRzyoBvyoBvyoRzyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR7zpir0rjz0rz/zqTDyoR7yoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR71tlD626r98uD+9ur979j515/0sUTyoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR7zpSf0sEH63a7//v3////////98d71ulryoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoRz4yoD++fL////////////////979j0rjzyoBvyoR3yoR3yoR3yoR3yoR3yoBzzqjP75cL////////////////////////50I/yoBvyoR3yoR3yoR3yoR3yoR3yoBr3x3n//fr////////////////////////86crzpijyoRzyoR3yoR3yoR3yoR3yoBr3w2///Pf++/T86Mf74LX//Pj////////98+H0rDfyoBvyoR3yoR3yoR3yoR3yoBv51Jf87NH2vF7ypCX0rj3+9Ob//////////Pj3x3nyoR7yoR3yoR3yoR3yoR3yoRz1uFT0rj3ynxnyoRzyoiD4y4P98+P98Nv51p32v2byoh7yoR3yoR3yoR3yoR3yoR3yoBzyoBzyoR3yoR3yoRzyoh/0rDjzqzTyoR3yoiDyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoBvyoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image><InputEncoding>UTF-8</InputEncoding><moz:SearchForm>https://twitter.com/search-home</moz:SearchForm></OpenSearchDescription>`); | |
const logoSVGPathData = "M67.812 16.141a26.246 26.246 0 0 1-7.519 2.06 13.134 13.134 0 0 0 5.756-7.244 26.127 26.127 0 0 1-8.313 3.176A13.075 13.075 0 0 0 48.182 10c-7.229 0-13.092 5.861-13.092 13.093 0 1.026.118 2.021.338 2.981-10.885-.548-20.528-5.757-26.987-13.679a13.048 13.048 0 0 0-1.771 6.581c0 4.542 2.312 8.551 5.824 10.898a13.048 13.048 0 0 1-5.93-1.638c-.002.055-.002.11-.002.162 0 6.345 4.513 11.638 10.504 12.84a13.177 13.177 0 0 1-3.449.457c-.846 0-1.667-.078-2.465-.231 1.667 5.2 6.499 8.986 12.23 9.09a26.276 26.276 0 0 1-16.26 5.606A26.21 26.21 0 0 1 4 55.976a37.036 37.036 0 0 0 20.067 5.882c24.083 0 37.251-19.949 37.251-37.249 0-.566-.014-1.134-.039-1.694a26.597 26.597 0 0 0 6.533-6.774z"; | |
const IconData = new Set([ | |
{ | |
rel: "shortcut icon", | |
href: "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJkSURBVHgB7VZBbtpQEH3zIW0WVYuXVaH4Bs0NSk4AOUFhEarskhMknIDsqkKlcIT0BNAT1D1B3ZJK3dmVuirwp/MhVmzAxiagKBJv9+ePZ97M/JkxsMMODwzChlD84FWQp3MxeCDHAhiumB+MJrr1+8Ryw3p/9+H4DctfIPCq49Xlw8Kv99YlMuB19885gy/i7llziwGfFFWJyR02XzSCuwiBUse7BlFVaz5LS8KQVkRXaXRJsqImfDjKSZBNyzEyFWFKVJ4KFbWLElUao6KbSk8i9TXgTPaorxTskPwOxa7/9baGt4zg8oQbNyfWYJlRU0/KUx9ZwNwYNq1ecFRzl18QpW0bB0Ks//KjV1uwlbuLJA3GxEdh5wb5yGEPl3qMd2xecYQHKnlFlVLX95kxYCFKGg5IlU2a0uLpCM68LEJA+sJ/Dm6Jy3aMjQIRakRUm+UuvfOp/X34iQSejeFo0Hdx4optG5uFH/R+GHNvANcm3VtwLs+Lvy2TRwhIOnrYHhysIuDKcCDwGbYAjglOzQt+HssElF6dvoNNOZeuCSbfSgIGMjILMo4/ExZf7TqghNLmlwm1gpSC2tmaLAZMvWGz0Iu7XpqBm2NrQNN5cD+Y5ZOTdZyok3RZMusZOJUN+QZrQFb0oQkG6xIIYHe8A03Unx/Ryd6jS2ctAsbxmFRVynGKlM5na5ePVkUe0p+h9MmraS2zXqYgmSWjOPtElHbLTVB3Q79gqQlMScxqXpeav0UWiGMmXKSNOpZAAPvKs/U/1MRoxRxl+5WD+psUy2D5IdmRVoWjnqDnLlkyO+zwaPAf1zXwZL751PUAAAAASUVORK5CYII=" | |
}, | |
{ | |
rel: "apple-touch-icon-precomposed", | |
href: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAMAAAC7xnO3AAAByFBMVEUdofIeofIgovIfovIboPIZn/IcoPIeovINmvEUnfEmpfMtqPMho/IQnPEXnvIYn/IaoPITnfF8yffH6Pzn9f7v+P7i8/224ftfvfYJmfE5rfQ4rPQyqvNYuvUPm/ERnPFIs/Th8v3///+64vsnpfNHs/Sd1vnh8/00q/N4x/dTt/UMmvEio/L8/v/6/f/+/v/+///9/v/g8v3U7f12xvcAlfC14Pv7/f9bu/YKmfGEzPgSnPFivvbT7fx7yPcNm/F6yPfZ7/2f1/r1+/6n2voXn/K04PsvqfPE5/y74/vy+v6Cy/glpPIVnvLl9P6j2fohovL7/v/o9f6Q0flCsPQQm/Ejo/Lq9v7F5/wZoPIsp/Pw+f7R7PyZ1flrwvdKtPUDlvH3/P+y3/uU0/lLtPWGzfie1/nd8f19yfia1flUuPX5/f8cofK44ftuwvcOm/Hm9f7p9v5dvPZzxffY7/2Mz/gxqfPr9/4opvNyxPfu+P4ppvMuqPNqwfb2+/4/r/Sf1/nz+v5GsvRAr/SY1Pn4/P/a8P1cu/ZgvfaX1PnO6vwUnfJauvbJ6fxTuPUSnfFSt/Wr3Prx+f5YufWV0/m/5Pu95PthvfYAMLrrAAACaklEQVR42u3UU3vmQACG4UHycVLbfdeYYJW1baO2ba1t6e9WSrsz1dHqPs31JBmS//77nVFK15QxbpghxsikMCUalJNFmBGJxuLCsniYcJGQSDVhUpQtCpNFSmpaekZmVtSk0eycXHVKE/PyC8SCsLCoGNPWrU/asHHTZlNZssgWbN22PfjFIglbOq4nJXbsBHbtDhNlae2Bv3cf42QaNcQO2JgmAew/cDBP/dGkQwAOFySK6afsyNHJcC49dvzEyVOUKMud8IHTZ7YZYvK7PPksJOa4wLlkQ1mywnWQrsT5Cxe3XaJCkIuX4WCOgyuXDPU4r0ZS4APXgOs3biZGblm37wRKibsRwokSvVdSCg9wfQBl5RWVOTvgBcp1yYxoiKq9gAvA8TGp2gcCZY2lK43ttXX1mOH50kXQNTRErmpKeqoRm6oxz11YNmnLq5Fm6HloKWSakkeLIF2ouUgvMSnRYAUb0epASWLd5Cc1aFtSO6ArOzr1JQmHko92KT/qoDuWRPUlNXN6evugGKuP/oggeuHEAag6eBgcmvyknoj0wvdUnxzuFGRJ/EAzsHj7wMa6A3zZu/XArpFfv3h51FyuJJRbY/fLS+EGwwcPk9mSFWeMibCZffuRs+BXHz+xlh5km1VQ2BlJePrseaCTHl7kFC4dGhdfvsrveP3GBSSmuRMdrrC3gVD9zXdvAEA+l47rOp70JYD3HzoNRpZjffz0eRABX2q+XjrAKFkW54UFJVnfvh+7nj6S1vfj28+xgkLOyIowZlqRA22xkpKLoQORWyZTdDqUCU6STNMgXOj/U59PIP/99/saB5WfkaTs+9E0AAAAAElFTkSuQmCC" | |
}, | |
{ | |
rel: "apple-touch-icon-precomposed", | |
sizes: "144x144", | |
href: "data:image/png;base64,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" | |
}, | |
{ | |
rel: "icon", | |
type: "image/png", | |
sizes: "32x32", | |
href: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAeFBMVEUAAAAYl+8gl+8gn+8gn+8Qn+8bmu8gmu8cm+8cl+8Zme8ZnO8dnO8dmu8bmu8bme8eme8em+8em/Ecm/Ecme8em+8cmu8dmvEdme8cmvAdmu8cm/Acmu8dmu8cm/Admu8dmvAemvAenPAdnPAcm+8dm/Aem/Adm/Dnzx9gAAAAJ3RSTlMAICAgEBAwMEBAUFBQYGBwcHB/f4CAkJ+gr7C/wMDP0N/f39/g7+/iptBPAAAAsElEQVR42tXO0wHFABQD0Dyjto3sv2HtLtDze5Hgon5BxdS5Afi90JMVrOgcmErgYOBTwUzmLLu/0YtJA5OCk9orxHmB6W8swBUJA5ud4L9LoIDRo2av8pSfwcUdo5fGUy+MyqDgiQoTm6dCTD48ZWN23uGNhZSfJ8xUu+aehJUvDxxsWNzJ7tiSEm58cfCpzwrMPkbFWb29F2XTKbgSHfKjzfiLo4fqJzVZJ676xAU1VoE4D0+QfE0AAAAASUVORK5CYII=" | |
}, | |
{ | |
rel: "mask-icon", | |
href: "data:image/svg+xml," + encodeURIComponent(`<svg width="72" height="72" viewBox="0 0 72 72" style="fill: #1da1f2"><path d="M67.812 16.141a26.246 26.246 0 0 1-7.519 2.06 13.134 13.134 0 0 0 5.756-7.244 26.127 26.127 0 0 1-8.313 3.176A13.075 13.075 0 0 0 48.182 10c-7.229 0-13.092 5.861-13.092 13.093 0 1.026.118 2.021.338 2.981-10.885-.548-20.528-5.757-26.987-13.679a13.048 13.048 0 0 0-1.771 6.581c0 4.542 2.312 8.551 5.824 10.898a13.048 13.048 0 0 1-5.93-1.638c-.002.055-.002.11-.002.162 0 6.345 4.513 11.638 10.504 12.84a13.177 13.177 0 0 1-3.449.457c-.846 0-1.667-.078-2.465-.231 1.667 5.2 6.499 8.986 12.23 9.09a26.276 26.276 0 0 1-16.26 5.606A26.21 26.21 0 0 1 4 55.976a37.036 37.036 0 0 0 20.067 5.882c24.083 0 37.251-19.949 37.251-37.249 0-.566-.014-1.134-.039-1.694a26.597 26.597 0 0 0 6.533-6.774z"></path></svg>`) | |
}, | |
{ | |
rel: "apple-touch-icon", | |
href: "https://abs.twimg.com/responsive-web/client-web/icon-ios.b1fc727a.png" | |
} | |
]); | |
// ======================================== | |
// FUNCTIONS | |
// ======================================== | |
//TODO: NEED TO FIGURE OUT HOW TO NOT TRIGGER CSP RESTRICTIONS FOR MANIFEST | |
function modifyManifest() { | |
const manifest = getManifest(); | |
if (manifest && !manifestError) { | |
manifestWatcher.disconnect(); | |
console.log("[script] Changing web manifest"); | |
manifest.href = manifestData; | |
elementSet.add(manifest); | |
manifestWatcher.observe(manifest, linkWatchConfig); | |
return true; | |
} | |
return false; | |
} | |
function modifyOpenSearch() { | |
const search = getSearch(); | |
if (search) { | |
searchWatcher.disconnect(); | |
console.log("[script] Changing search definition"); | |
// search.type = "text/xml"; | |
search.href = openSearchData; | |
elementSet.add(search); | |
searchWatcher.observe(search, linkWatchConfig); | |
return true; | |
} | |
return false; | |
} | |
function modifyLinks() { | |
linkWatcher.disconnect(); | |
for (const data of IconData) { | |
const existingLink = document.head.querySelector(`link[rel="${data.rel}"]`); | |
if (existingLink && existingLink.href !== data.href) { | |
if (existingLink.href.startsWith("chrome-extension://" || existingLink.href.startsWith("moz-extension://"))) { | |
console.log("[script] Management of link '" + data.rel + "' relinquished to extension"); | |
IconData.delete(data); | |
continue; | |
} | |
console.log("[script] Changing link: " + data.rel); | |
for (const attr in data) { | |
existingLink.setAttribute(attr, data[attr]); | |
} | |
processedLinks.add(data); | |
elementSet.add(existingLink); | |
linkWatcher.observe(existingLink, {attributes: true, attributeFilter: ["href"]}); | |
} | |
} | |
return processedLinks.size >= IconData.size; | |
} | |
function modifyPageLogo() { | |
const svg = document.querySelector("a[href='/'] svg") || document.querySelector("a[href='/home'] svg"); | |
if (svg) { | |
const path = svg.getElementsByTagName("path")[0]; | |
if (path) { | |
logoWatcher.disconnect(); | |
svg.setAttribute("viewBox", "0 0 72 72"); | |
svg.style.fill = "#1d9bf0"; | |
path.setAttribute("d", logoSVGPathData); | |
elementSet.add(svg); | |
logoWatcher.observe(svg.parentElement, logoWatchConfig); | |
console.log("[script] Twitter logo replaced."); | |
return true; | |
} | |
} | |
return false; | |
} | |
function addMissingLinks() { | |
for (const data of IconData) { | |
if (!processedLinks.has(data)) { | |
const link = document.createElement("link"); | |
for (const attr in data) { | |
link.setAttribute(attr, data[attr]); | |
} | |
console.log("[script] Adding link: " + data.rel); | |
document.head.append(link); | |
processedLinks.add(data); | |
linkWatcher.observe(link, {attributes: true, attributeFilter: ["href"]}); | |
} | |
} | |
} | |
function mainLoader(maxLoops = 20) { | |
// Clear any existing backup loop | |
if (loaderLoop !== -1) { | |
clearInterval(loaderLoop); | |
loaderLoop = -1; | |
} | |
let count = 0; | |
const toRun = RunFlags(); | |
processedLinks.clear(); | |
loaderLoop = setInterval(() => { | |
count++; | |
if (toRun.manifest && modifyManifest()) { | |
toRun.manifest = false; | |
} | |
if (toRun.search && modifyOpenSearch()) { | |
toRun.search = false; | |
} | |
if (toRun.link && modifyLinks()) { | |
toRun.link = false; | |
} | |
if (toRun.logo && modifyPageLogo()) { | |
toRun.logo = false; | |
} | |
if (count > maxLoops || !(toRun.link || toRun.logo || toRun.manifest || toRun.search)) { | |
clearInterval(loaderLoop); | |
addMissingLinks(); | |
loaderLoop = -1; | |
} | |
}, 250); | |
} | |
function secondaryLoader(maxLoops) { | |
let rerunRequired = false; | |
elementSet.forEach(elem => { | |
if (!elem.isConnected) { | |
rerunRequired = true; | |
elementSet.delete(elem); | |
} | |
}); | |
if (rerunRequired) { | |
mainLoader(maxLoops); | |
} | |
} | |
// ======================================== | |
// RUN | |
// ======================================== | |
// Re-check in case of a full reload of the page content | |
if (window.onurlchange === null) { | |
window.addEventListener("urlchange", () => { secondaryLoader(10) }); | |
} | |
else { | |
window.addEventListener("popstate", () => { secondaryLoader(10) }); | |
} | |
// Init | |
mainLoader(); | |
document.addEventListener("securitypolicyviolation", (e) => { | |
if (!manifestError && e.violatedDirective === "manifest-src" && e.blockedURI === "data") { | |
console.log("%c[script] Manifest replacement disabled due to Content Security Policy not allowing 'data:' resources for 'manifest-src'.", "font-size: 1.5em; margin-right: 30%;"); | |
manifestWatcher.disconnect(); | |
manifestError = true; | |
const manifest = getManifest(); | |
if (manifest) { | |
if (elementSet.has(manifest)) { | |
elementSet.delete(manifest); | |
} | |
manifest.remove(); | |
} | |
} | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment