diff options
Diffstat (limited to 'data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js')
-rw-r--r-- | data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js index 600a501..f59eed8 100644 --- a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js +++ b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/content/externalLicenseChecker.js @@ -2,6 +2,7 @@ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript. * * Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> +* Copyright (C) 2022 Yuchen Pei <id@ypei.org> * * This file is part of GNU LibreJS. * @@ -20,38 +21,42 @@ */ "use strict"; { - let licensedScripts = null; - - let fetchWebLabels = async args => { - // see https://www.gnu.org/software/librejs/free-your-javascript.html#step3 - let { map, cache } = args; - let link = document.querySelector(`link[rel="jslicense"], link[data-jslicense="1"], a[rel="jslicense"], a[data-jslicense="1"]`); - let baseURL = link ? link.href : cache.webLabels && new URL(cache.webLabels.href, document.baseURI); - if (baseURL) try { - let response = await fetch(baseURL); + // Find and fetch the url to the web labels table, and returns the + // license info in the table as a map from the script url to + // { script: {url, label}, + // licenseLinks: [{url, label}], + // sources: [{url, label}] } + // + // see https://www.gnu.org/software/librejs/free-your-javascript.html#step3 + const fetchWebLabels = async args => { + const { map, cache } = args; + const link = document.querySelector(`link[rel="jslicense"], link[data-jslicense="1"], a[rel="jslicense"], a[data-jslicense="1"]`); + const webLabelsUrl = link ? link.href : cache.webLabels && new URL(cache.webLabels.href, document.baseURI); + if (webLabelsUrl) try { + const response = await fetch(webLabelsUrl); if (!response.ok) throw `${response.status} ${response.statusText}`; - let doc = new DOMParser().parseFromString( + const doc = new DOMParser().parseFromString( await response.text(), - "text/html" + 'text/html' ); - let base = doc.querySelector("base"); - if (base) { - base.href = base.href; - } else { - doc.head.appendChild(doc.createElement("base")).href = baseURL; + // Sets the base url to be the url of the weblabel page if it + // does not exist. Otherwise relative links on the weblabels + // page will use the base of the current page. + if (!doc.querySelector("base")) { + doc.head.appendChild(doc.createElement("base")).href = webLabelsUrl; } - let link = a => ({ url: a.href, label: a.textContent }); - let firstLink = parent => link(parent.querySelector("a")); - let allLinks = parent => Array.prototype.map.call(parent.querySelectorAll("a"), link); - for (let row of doc.querySelectorAll("table#jslicense-labels1 > tbody > tr")) { + const link = a => ({ url: a.href, label: a.textContent }); + const firstLink = parent => link(parent.querySelector("a")); + const allLinks = parent => Array.prototype.map.call(parent.querySelectorAll("a"), link); + for (const row of doc.querySelectorAll("table#jslicense-labels1 > tbody > tr")) { try { - let cols = row.querySelectorAll("td"); - let script = firstLink(cols[0]); - let licenseLinks = allLinks(cols[1]); - let sources = cols[2] ? allLinks(cols[2]) : []; + const cols = row.querySelectorAll("td"); + const script = firstLink(cols[0]); + const licenseLinks = allLinks(cols[1]); + const sources = cols[2] ? allLinks(cols[2]) : []; map.set(script.url, { script, licenseLinks, sources }); } catch (e) { - console.error("LibreJS: error parsing Web Labels at %s, row %s", baseURL, row.innerHTML, e); + console.error("LibreJS: error parsing Web Labels at %s, row %s", webLabelsUrl, row.innerHTML, e); } } } catch (e) { @@ -60,9 +65,9 @@ return map; } - let fetchLicenseInfo = async cache => { - let map = new Map(); - let args = { map, cache }; + const fetchLicenseInfo = async cache => { + const map = new Map(); + const args = { map, cache }; // in the fetchXxx methods we add to a map whatever license(s) // URLs and source code references we can find in various formats // (WebLabels is currently the only implementation), keyed by script URLs. @@ -75,10 +80,15 @@ return map; } - let handlers = { + const handlers = { + // Look up the script url in the web labels and return it if found, + // otherwise return undefined. The found value is of the format + // { script: {url, label}, + // licenseLinks: [{url, label}], + // sources: [{url, label}] } async checkLicensedScript(m) { - let { url, cache } = m; - if (!licensedScripts) licensedScripts = await fetchLicenseInfo(cache); + const { url, cache } = m; + const licensedScripts = await fetchLicenseInfo(cache); return licensedScripts.get(url) || licensedScripts.get(url.replace(/\?.*/, '')); } } @@ -86,7 +96,7 @@ browser.runtime.onMessage.addListener(async m => { if (m.action in handlers) try { debug("Received message", m); - let result = await handlers[m.action](m); + const result = await handlers[m.action](m); return result; } catch (e) { console.error(e); |