-
Notifications
You must be signed in to change notification settings - Fork 3
/
unmute_content.js
71 lines (63 loc) · 3.02 KB
/
unmute_content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"use strict";
/**
* Content script that assists in unmuting tabs on supported sites when you
* interact with a mute button or volume slider on the page.
*/
function unmuteMyTab() {
chrome.runtime.sendMessage(null, "unmute");
}
/**
* Get classNames of element and its parents, up to `depth` elements,
* but possibly more class names, because an element can have more than one.
*/
function getClassNames(elem, depth) {
const classNames = [];
while(elem && depth--) {
for(const name of elem.classList) {
classNames.push(name);
}
elem = elem.parentNode;
}
return classNames;
}
function includesAny(haystack, needles) {
for(const needle of needles) {
if(haystack.includes(needle)) {
return true;
}
}
return false;
}
const volumeControlChecks = {
"www.youtube.com": ev => /^ytp-(volume|mute)-/.test(ev.target.className)
,"www.liveleak.com": ev => getClassNames(ev.target, 6).includes("vjs-volume-menu-button")
,"vimeo.com": ev => getClassNames(ev.target, 3).includes("volume")
,"player.vimeo.com": ev => getClassNames(ev.target, 3).includes("volume")
,"twitter.com": ev => getClassNames(ev.target, 4).includes("volume-control")
,"vine.co": ev => includesAny(getClassNames(ev.target, 3), ["VolumeControl", "vine-audio"])
,"soundcloud.com": ev => /^volume__/.test(ev.target.className)
,"www.twitch.tv": ev => getClassNames(ev.target, 4).includes("player-volume")
,"player.twitch.tv": ev => getClassNames(ev.target, 4).includes("player-volume")
,"mynoise.net": ev => includesAny(getClassNames(ev.target, 5), ["mixer", "controlers"])
,"www.kickstarter.com": ev => includesAny(getClassNames(ev.target, 4), ["volume", "volume_container"])
,"store.steampowered.com": ev => includesAny(getClassNames(ev.target, 3), ["volume_icon", "volume_slider"])
,"vid.me": ev => includesAny(getClassNames(ev.target, 4), ["vjs-volume-menu-button", "vjs-volume-bar"])
,"www.dailymotion.com": ev => includesAny(getClassNames(ev.target, 5), ["dmp_VolumeSlider"])
,"www.vevo.com": ev => includesAny(getClassNames(ev.target, 6), ["volume"])
,"www.cnn.com": ev => includesAny(getClassNames(ev.target, 4), ["vjs-volume-control", "vjs-mute-control"])
,"edition.cnn.com": ev => includesAny(getClassNames(ev.target, 4), ["vjs-volume-control", "vjs-mute-control"])
,"archive.org": ev => includesAny(getClassNames(ev.target, 4), ["jw-icon-volume", "jw-slider-volume"])
};
const host = document.location.host;
function mouseDown(ev) {
// Note that it is possible that Chrome will inject this content script into
// a page or frame on a domain that we don't support.
const check = volumeControlChecks[host];
if(check && check(ev)) {
unmuteMyTab();
}
}
// Listen on the whole document instead of specific elements because
// 1) the elements sometimes show up after the DOM is ready
// 2) the elements may be swapped out when switching to another video
document.addEventListener('mousedown', mouseDown, {passive: true});