// ==UserScript== // @name youtube-noscript-shim // @namespace systemreboot.net // @description Use YouTube with NoScript // @include https://www.youtube.com/* // @version 0.5 // @grant none // ==/UserScript== // Copyright (C) 2017 Arun Isaac // 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 . /** * 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"); });