/** \file * \brief Code that handles domain-specific levels handling in options * * \author Copyright (C) 2019-2022 Libor Polcak * \author Copyright (C) 2019 Martin Timko * * \license SPDX-License-Identifier: GPL-3.0-or-later */ // // 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 . // function restore_domain(domain, settings) { domains[domain] = settings; saveDomainLevels(); var existPref = document.getElementById(`li-exist-group-${escape(domain)}`); existPref.classList.remove("hidden"); var removedPref = document.getElementById(`li-removed-group-${escape(domain)}`); removedPref.classList.add("hidden"); var lielem = document.getElementById(`dl-${escape(domain)}`); lielem.classList.remove("undo"); } function remove_domain(domain) { // See https://alistapart.com/article/neveruseawarning/ var existPref = document.getElementById(`li-exist-group-${escape(domain)}`); existPref.classList.add("hidden"); var removedPref = document.getElementById(`li-removed-group-${escape(domain)}`); removedPref.classList.remove("hidden"); var lielem = document.getElementById(`dl-${escape(domain)}`); lielem.classList.add("undo"); delete domains[domain]; saveDomainLevels(); } function show_restore_domain_level(levelLiEl, domain) { let level = Object.assign({}, levels[domains[domain].restore]); if (domains[domain].restore_tweaks) { level.tweaks = domains[domain].restore_tweaks; } if (!level) { return false; } var fragment = document.createRange().createContextualFragment(` ${escape(domain)} JavaScript shield disabled `); levelLiEl.appendChild(fragment); document.getElementById(`enable-jss-${escape(domain)}`).addEventListener("click", function(e) { e.preventDefault(); domains[domain] = level; levelLiEl.innerHTML = ""; saveDomainLevels(); show_domain_level_custom_level(levelLiEl, domain); }); return true; } function show_domain_level(levelsEl, domain) { var displayedEl = document.getElementById(`dl-${escape(domain)}`); if (displayedEl !== null) { displayedEl.remove(); } var fragment = document.createRange().createContextualFragment(`
  • `); levelsEl.appendChild(fragment); let levelLiEl = document.getElementById(`dl-${escape(domain)}`); if (domains[domain].restore) { if (show_restore_domain_level(levelLiEl, domain)) { return; } else { domains[domain] = level_0; saveDomainLevels(); } } show_domain_level_custom_level(levelLiEl, domain); } function show_domain_level_custom_level(levelLiEl, domain) { let tweaks = Object.assign({}, domains[domain].tweaks || {}); var fragment = document.createRange().createContextualFragment(` ${escape(domain)} tweaked
    `); levelLiEl.appendChild(fragment); let levelSelectEl = document.getElementById(`dl-change-${escape(domain)}`); update_domain_level(levelSelectEl, domains[domain].level_id); document.getElementById(`overwrite-dl-${escape(domain)}`).addEventListener("click", function(e) { e.preventDefault(); let domainLevel = levelSelectEl.value; domains[domain] = { level_id: domainLevel, } if (Object.keys(tweaks).length > 0) { domains[domain].tweaks = tweaks; } saveDomainLevels(); }); document.getElementById(`delete-dl-${escape(domain)}`).addEventListener("click", remove_domain.bind(null, domain)); document.getElementById(`restore-dl-${escape(domain)}`).addEventListener("click", restore_domain.bind(null, domain, domains[domain])); let tweaksEl = document.getElementById(`tweaks-${escape(domain)}`); let tweaksTextEl = document.getElementById(`tweaks-text-${escape(domain)}`); let tweaksBusiness = Object.create(tweaks_gui); tweaksBusiness.get_current_tweaks = function() { return getTweaksForLevel(domains[domain].level_id, tweaks); }; tweaksBusiness.tweak_changed = function(group_id, desired_tweak) { if ((desired_tweak === levels[levelSelectEl.value][group_id]) || (desired_tweak === 0 && levels[levelSelectEl.value][group_id] === undefined)) { delete tweaks[group_id]; } else { tweaks[group_id] = desired_tweak; } if (Object.keys(tweaks).length > 0) { domains[domain].tweaks = tweaks; tweaksTextEl.classList.remove("hidden_descr"); } else { tweaksTextEl.classList.add("hidden_descr"); } } tweaksBusiness.create_tweaks_html(tweaksEl); if (Object.keys(tweaks).length == 0) { tweaksEl.classList.add("hidden_descr"); tweaksTextEl.classList.add("hidden_descr"); } levelSelectEl.addEventListener("change", function(e) { let oldtweaks = domains[domain].tweaks || {}; domains[domain] = { level_id: this.value, } if (Object.keys(oldtweaks).length > 0) { domains[domain].tweaks = oldtweaks; } tweaksBusiness.create_tweaks_html(tweaksEl); }); document.getElementById(`show-tweaks-${escape(domain)}`).addEventListener("click", function(ev) { tweaksEl.classList.toggle("hidden_descr"); ev.preventDefault(); }); } function insert_domain_levels() { // Insert all known levels to GUI var allDomainsElement = document.getElementById("domain-level-list"); for (let domain in domains) { if (domain === escape(domain)) { // Do not display invalid domains inserted before https://pagure.io/JShelter/webextension/issue/45 fix // Note that an invalid domain can be inserted through advanced options show_domain_level(allDomainsElement, domain); } else { console.error("Invalid domain in configuration: " + domain); } } } window.addEventListener("load", function() { if (!levels_initialised) { levels_updated_callbacks.push(insert_domain_levels); levels_updated_callbacks.push(update_domain_level.bind(null, document.getElementById("domain-level"))); } else { insert_domain_levels(); update_domain_level(document.getElementById("domain-level")); } }); document.getElementById("add_domain").addEventListener("click", function (e) { e.preventDefault(); let domainEl = document.getElementById("domain-text"); let domain = domainEl.value; if (escape(domain) !== domain) { alert("Unsupported domain " + domain); return; } let domainLevel = document.getElementById("domain-level"); if (domain in domains) { let ok = confirm(`Settings for domain ${domain} already exists and will be overriden.`); if (!ok) { return; } } domains[domain] = { level_id: domainLevel.value, } saveDomainLevels(); domainEl.value = ""; var allDomainsElement = document.getElementById("domain-level-list"); show_domain_level(allDomainsElement, domain); }); function update_domain_level(dlel, set_value) { var finalValue = set_value || dlel.value; dlel.textContent = ""; for (let levelid in levels) { let descr = levels[levelid].level_description; dlel.appendChild(document.createRange().createContextualFragment(``)); }; dlel.value = finalValue; } document.getElementById("save-all-domain-levels").addEventListener("click", function (e) { e.preventDefault(); Array.prototype.forEach.call(document.getElementsByClassName("undo"), (el) => el.remove()); Array.prototype.forEach.call(document.getElementsByClassName("custom_domain_level"), function (el) { let new_val = el.getElementsByTagName("select")[0].value; domains[el.attributes["jsr_domain"].value].level_id = new_val; }); saveDomainLevels(); }); document.getElementById("delete-all-domain-levels").addEventListener("click", function (e) { domains = {}; saveDomainLevels(); Array.from(document.getElementsByClassName("custom_domain_level")).forEach((el) => el.remove()); });