aboutsummaryrefslogtreecommitdiff
path: root/youtube-noscript-shim.user.js
blob: 5dc86039b6e91cc9886b9e101262dfd6d4a8f451 (plain)
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");
});