-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadskip.js
154 lines (124 loc) · 3.4 KB
/
adskip.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
(function () {
var classList = [
'videoAdUiSkipButton', // Old close ad button
'ytp-ad-skip-button ytp-button', // New close ad button
'ytp-ad-overlay-close-button', // Close overlay button
];
var timeoutId;
var observedSkipBtn;
var skipBtnObserver;
function existingButtons(classNames) {
return classNames
.map(name => {
return Array.from(document.getElementsByClassName(name)) || [];
})
.reduce(function(acc, elems) {
return acc.concat(elems);
}, [])
}
function isBtnVisible(button) {
return button.offsetParent === null ? false : true;
}
function triggerClickWhenVisible(button) {
if (button === observedSkipBtn) {
return;
}
var parentWithDisplayStyle = (function() {
var currentParent = button;
while (currentParent !== null) {
if (currentParent.style.display === 'none') {
return currentParent;
}
currentParent = currentParent.parentElement;
}
return null;
})();
if (!parentWithDisplayStyle) {
return;
}
if (skipBtnObserver && observedSkipBtn) {
skipBtnObserver.disconnect();
triggerClick(observedSkipBtn);
}
if (!skipBtnObserver) {
skipBtnObserver = new MutationObserver(function() {
if (!isBtnVisible(observedSkipBtn)) {
return;
}
triggerClick(observedSkipBtn);
observedSkipBtn = undefined;
skipBtnObserver.disconnect();
});
}
observedSkipBtn = button;
skipBtnObserver.observe(parentWithDisplayStyle, { attributes: true });
}
function checkAndClickButtons() {
existingButtons(classList).forEach(button => {
if (!isBtnVisible(button)) {
triggerClickWhenVisible(button);
return;
}
triggerClick(button);
})
}
/**
* Triggers a click event on the given DOM element.
*
* This function is based on an answer here:
* http://stackoverflow.com/questions/2705583/how-to-simulate-a-click-with-javascript
*
* @param {Element} el
*/
function triggerClick(el) {
var etype = 'click';
if (typeof el.fireEvent === 'function') {
el.fireEvent('on' + etype);
} else if (typeof el.dispatchEvent === 'function') {
var evObj = document.createEvent('Events');
evObj.initEvent(etype, true, false);
el.dispatchEvent(evObj);
}
}
function initObserver() {
if (!('MutationObserver' in window)) {
return false;
}
var ytdPlayer = (function(nodeList) {
return nodeList && nodeList[0];
})(document.getElementsByTagName('ytd-player'));
if (!ytdPlayer) {
return false;
}
var observer = new MutationObserver(function() {
checkAndClickButtons();
});
observer.observe(ytdPlayer, { childList: true, subtree: true });
clearTimeout(timeoutId);
return true;
}
function initTimeout() {
clearTimeout(timeoutId);
if (initObserver()) {
return;
}
timeoutId = setTimeout(function() {
checkAndClickButtons();
initTimeout();
}, 2000);
}
var inIframe = (function() {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
})();
/**
* Only start the script if we are at the top level. YouTube has a few iframes
* in the page which would also be running this content script.
*/
if (!inIframe) {
initTimeout();
}
})();