forked from didirus/AstralRinth
* feat: consistently format all HTML, XML, JSON, CSS, JS, TS, SQL, TOML, YAML, and Markdown files * chore: deal with VS Code not being able to parse valid editorconfig syntax Sometimes I'm surprised that computers even work. * chore: get rid of IntelliJ IDE config files that should not be there These were already added to the `.gitignore` a long time ago, and now are being ignored by Prettier. * fix: rename `tooling-config` `format` script to `fix` for it to run with Turbo
107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
document.addEventListener(
|
|
'click',
|
|
function (e) {
|
|
window.top.postMessage({ modrinthAdClick: true }, 'https://modrinth.com')
|
|
|
|
let target = e.target
|
|
while (target != null) {
|
|
if (target.matches('a')) {
|
|
e.preventDefault()
|
|
if (target.href) {
|
|
window.top.postMessage({ modrinthOpenUrl: target.href }, 'https://modrinth.com')
|
|
}
|
|
break
|
|
}
|
|
target = target.parentElement
|
|
}
|
|
},
|
|
true,
|
|
)
|
|
|
|
window.open = (url, target, features) => {
|
|
window.top.postMessage({ modrinthOpenUrl: url }, 'https://modrinth.com')
|
|
}
|
|
|
|
function muteAudioContext() {
|
|
if (window.AudioContext || window.webkitAudioContext) {
|
|
const AudioContext = window.AudioContext || window.webkitAudioContext
|
|
const originalCreateMediaElementSource = AudioContext.prototype.createMediaElementSource
|
|
const originalCreateMediaStreamSource = AudioContext.prototype.createMediaStreamSource
|
|
const originalCreateMediaStreamTrackSource = AudioContext.prototype.createMediaStreamTrackSource
|
|
const originalCreateBufferSource = AudioContext.prototype.createBufferSource
|
|
const originalCreateOscillator = AudioContext.prototype.createOscillator
|
|
|
|
AudioContext.prototype.createGain = function () {
|
|
const gain = originalCreateGain.call(this)
|
|
gain.gain.value = 0
|
|
return gain
|
|
}
|
|
|
|
AudioContext.prototype.createMediaElementSource = function (mediaElement) {
|
|
const source = originalCreateMediaElementSource.call(this, mediaElement)
|
|
source.connect(this.createGain())
|
|
return source
|
|
}
|
|
|
|
AudioContext.prototype.createMediaStreamSource = function (mediaStream) {
|
|
const source = originalCreateMediaStreamSource.call(this, mediaStream)
|
|
source.connect(this.createGain())
|
|
return source
|
|
}
|
|
|
|
AudioContext.prototype.createMediaStreamTrackSource = function (mediaStreamTrack) {
|
|
const source = originalCreateMediaStreamTrackSource.call(this, mediaStreamTrack)
|
|
source.connect(this.createGain())
|
|
return source
|
|
}
|
|
|
|
AudioContext.prototype.createBufferSource = function () {
|
|
const source = originalCreateBufferSource.call(this)
|
|
source.connect(this.createGain())
|
|
return source
|
|
}
|
|
|
|
AudioContext.prototype.createOscillator = function () {
|
|
const oscillator = originalCreateOscillator.call(this)
|
|
oscillator.connect(this.createGain())
|
|
return oscillator
|
|
}
|
|
}
|
|
}
|
|
|
|
function muteVideo(mediaElement) {
|
|
let count = Number(mediaElement.getAttribute('data-modrinth-muted-count') ?? 0)
|
|
|
|
if (!mediaElement.muted || mediaElement.volume !== 0) {
|
|
mediaElement.muted = true
|
|
mediaElement.volume = 0
|
|
|
|
mediaElement.setAttribute('data-modrinth-muted-count', count + 1)
|
|
}
|
|
|
|
if (count > 5) {
|
|
// Video is detected as malicious, so it is removed from the page
|
|
mediaElement.remove()
|
|
}
|
|
}
|
|
|
|
function muteVideos() {
|
|
document.querySelectorAll('video, audio').forEach(function (mediaElement) {
|
|
muteVideo(mediaElement)
|
|
|
|
if (!mediaElement.hasAttribute('data-modrinth-muted')) {
|
|
mediaElement.addEventListener('volumechange', () => muteVideo(mediaElement))
|
|
|
|
mediaElement.setAttribute('data-modrinth-muted', 'true')
|
|
}
|
|
})
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
muteVideos()
|
|
muteAudioContext()
|
|
|
|
const observer = new MutationObserver(muteVideos)
|
|
observer.observe(document.body, { childList: true, subtree: true })
|
|
})
|