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
|
// ==UserScript==
// @name youtube-noscript-shim
// @namespace systemreboot.net
// @description Use YouTube with NoScript
// @include https://www.youtube.com/*
// @version 0.3
// @grant none
// ==/UserScript==
// Copyright (C) 2017 Arun Isaac <arunisaac@systemreboot.net>
// This program is free software: you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
/**
* Add/remove classes on one or more elements
* @param {string} selector - CSS selector for the elements
* @param {...string} classes - Classes to add/remove
*/
function toggleClasses (selector, ...classes) {
document.querySelectorAll(selector).forEach(function (element) {
classes.forEach(function (cls) {
element.classList.toggle(cls);
});
});
}
/**
* Toggle boolean attributes on one or more elements
* @param {string} selector - CSS selector for the elements
* @param {...string} classes - Boolean attributes to toggle
*/
function toggleBooleanAttributes (selector, ...attributes) {
document.querySelectorAll(selector).forEach(function (element) {
attributes.forEach(function (attribute) {
element.setAttribute(attribute, element.getAttribute(attribute) == "true" ? "false" : "true");
});
});
}
/**
* Attach event listener to one or more elements
* @param {string} selector - CSS selector for the elements
* @param {string} eventType - Event type to listen for
* @param {function} listener - Event listener callback function
*/
function attachEventListener (selector, eventType, listener) {
document.querySelectorAll(selector).forEach(function (element) {
element.addEventListener(eventType, listener)
});
}
// Remove all of YouTube's javascript. Thus, this addon does not
// depend on NoScript being installed.
document.querySelectorAll("script").forEach(function (script) {
script.remove();
});
// Load thumbnails
document.querySelectorAll("img[data-thumb]").forEach(function (img) {
img.setAttribute("src", img.getAttribute("data-thumb"));
});
// Search filters
attachEventListener(".filter-button", "click", function () {
toggleClasses(".filter-button", "yt-uix-button-toggled");
toggleClasses(".search-header", "yt-uix-expander-collapsed");
toggleBooleanAttributes(".filter-button", "aria-pressed");
});
// Menu
attachEventListener("#appbar-guide-button", "click", function () {
toggleClasses("html", "show-guide");
toggleBooleanAttributes("#appbar-guide-button", "aria-expanded");
});
|