summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhackademix2018-09-26 17:18:54 +0200
committerhackademix2018-09-26 17:19:44 +0200
commit92eed7d700e154b636053cf8579401318a03aed8 (patch)
treedfd311205f18a051c4ceda13219bfd1aa7024741 /src
parent8b36446fc9c172f0a27cf90b97051091b1a9f472 (diff)
downloadnoscript-92eed7d700e154b636053cf8579401318a03aed8.tar.gz
noscript-92eed7d700e154b636053cf8579401318a03aed8.tar.xz
noscript-92eed7d700e154b636053cf8579401318a03aed8.zip
FTP directory UI emulation on script-disabled domains.
Diffstat (limited to 'src')
-rw-r--r--src/content/ftp.js88
-rw-r--r--src/manifest.json7
2 files changed, 95 insertions, 0 deletions
diff --git a/src/content/ftp.js b/src/content/ftp.js
new file mode 100644
index 0000000..4b9585e
--- /dev/null
+++ b/src/content/ftp.js
@@ -0,0 +1,88 @@
+(() => {
+ // see https://dxr.mozilla.org/mozilla-central/rev/d03b538b6b417ba892d0a92fd693945b741246e1/netwerk/streamconv/converters/nsIndexedToHTML.cpp#381
+ 'use strict';
+ var gTable, gOrderBy, gTBody, gRows, gUI_showHidden;
+ document.addEventListener("DOMContentLoaded", function() {
+ if ("gUI_showHidden" in window.wrappedJSObject || // scripts are enabled
+ !(document.scripts[0] &&
+ /\bgUI_showHidden\b/.test(document.scripts[0].textContent)) // not a FTP dir listing
+ ) {
+ return;
+ }
+
+ gTable = document.getElementsByTagName("table")[0];
+ gTBody = gTable.tBodies[0];
+ if (gTBody.rows.length < 2)
+ return;
+ gUI_showHidden = document.getElementById("UI_showHidden")
+ var headCells = gTable.tHead.rows[0].cells,
+ hiddenObjects = false;
+ function rowAction(i) {
+ return function(event) {
+ event.preventDefault();
+ orderBy(i);
+ }
+ }
+ for (var i = headCells.length - 1; i >= 0; i--) {
+ var anchor = document.createElement("a");
+ anchor.href = "";
+ anchor.appendChild(headCells[i].firstChild);
+ headCells[i].appendChild(anchor);
+ headCells[i].addEventListener("click", rowAction(i), true);
+ }
+ if (gUI_showHidden) {
+ gRows = Array.slice(gTBody.rows);
+ hiddenObjects = gRows.some(row => row.className == "hidden-object");
+ }
+ gTable.setAttribute("order", "");
+ if (hiddenObjects) {
+ gUI_showHidden.style.display = "block";
+ updateHidden();
+ }
+ }, "false");
+ function compareRows(rowA, rowB) {
+ var a = rowA.cells[gOrderBy].getAttribute("sortable-data") || "";
+ var b = rowB.cells[gOrderBy].getAttribute("sortable-data") || "";
+ var intA = +a;
+ var intB = +b;
+ if (a == intA && b == intB) {
+ a = intA;
+ b = intB;
+ } else {
+ a = a.toLowerCase();
+ b = b.toLowerCase();
+ }
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+ }
+ function orderBy(column) {
+ if (!gRows)
+ gRows = Array.slice(gTBody.rows);
+ var order;
+ if (gOrderBy == column) {
+ order = gTable.getAttribute("order") == "asc" ? "desc" : "asc";
+ } else {
+ order = "asc";
+ gOrderBy = column;
+ gTable.setAttribute("order-by", column);
+ gRows.sort(compareRows);
+ }
+ gTable.removeChild(gTBody);
+ gTable.setAttribute("order", order);
+ if (order == "asc")
+ for (var i = 0; i < gRows.length; i++)
+ gTBody.appendChild(gRows[i]);
+ else
+ for (var i = gRows.length - 1; i >= 0; i--)
+ gTBody.appendChild(gRows[i]);
+ gTable.appendChild(gTBody);
+ }
+ function updateHidden() {
+ gTable.className = gUI_showHidden.getElementsByTagName("input")[0].checked ?
+ "" :
+ "remove-hidden";
+ }
+})();
diff --git a/src/manifest.json b/src/manifest.json
index 502b8b0..b230c6c 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -89,6 +89,13 @@
"content/webglHook.js",
"content/media.js"
]
+ },
+ {
+ "run_at": "document_start",
+ "matches": ["ftp://*/*"],
+ "js": [
+ "content/ftp.js"
+ ]
}
],