Skip to content

Commit 92eed7d

Browse files
committed
FTP directory UI emulation on script-disabled domains.
1 parent 8b36446 commit 92eed7d

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

src/content/ftp.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
(() => {
2+
// see https://dxr.mozilla.org/mozilla-central/rev/d03b538b6b417ba892d0a92fd693945b741246e1/netwerk/streamconv/converters/nsIndexedToHTML.cpp#381
3+
'use strict';
4+
var gTable, gOrderBy, gTBody, gRows, gUI_showHidden;
5+
document.addEventListener("DOMContentLoaded", function() {
6+
if ("gUI_showHidden" in window.wrappedJSObject || // scripts are enabled
7+
!(document.scripts[0] &&
8+
/\bgUI_showHidden\b/.test(document.scripts[0].textContent)) // not a FTP dir listing
9+
) {
10+
return;
11+
}
12+
13+
gTable = document.getElementsByTagName("table")[0];
14+
gTBody = gTable.tBodies[0];
15+
if (gTBody.rows.length < 2)
16+
return;
17+
gUI_showHidden = document.getElementById("UI_showHidden")
18+
var headCells = gTable.tHead.rows[0].cells,
19+
hiddenObjects = false;
20+
function rowAction(i) {
21+
return function(event) {
22+
event.preventDefault();
23+
orderBy(i);
24+
}
25+
}
26+
for (var i = headCells.length - 1; i >= 0; i--) {
27+
var anchor = document.createElement("a");
28+
anchor.href = "";
29+
anchor.appendChild(headCells[i].firstChild);
30+
headCells[i].appendChild(anchor);
31+
headCells[i].addEventListener("click", rowAction(i), true);
32+
}
33+
if (gUI_showHidden) {
34+
gRows = Array.slice(gTBody.rows);
35+
hiddenObjects = gRows.some(row => row.className == "hidden-object");
36+
}
37+
gTable.setAttribute("order", "");
38+
if (hiddenObjects) {
39+
gUI_showHidden.style.display = "block";
40+
updateHidden();
41+
}
42+
}, "false");
43+
function compareRows(rowA, rowB) {
44+
var a = rowA.cells[gOrderBy].getAttribute("sortable-data") || "";
45+
var b = rowB.cells[gOrderBy].getAttribute("sortable-data") || "";
46+
var intA = +a;
47+
var intB = +b;
48+
if (a == intA && b == intB) {
49+
a = intA;
50+
b = intB;
51+
} else {
52+
a = a.toLowerCase();
53+
b = b.toLowerCase();
54+
}
55+
if (a < b)
56+
return -1;
57+
if (a > b)
58+
return 1;
59+
return 0;
60+
}
61+
function orderBy(column) {
62+
if (!gRows)
63+
gRows = Array.slice(gTBody.rows);
64+
var order;
65+
if (gOrderBy == column) {
66+
order = gTable.getAttribute("order") == "asc" ? "desc" : "asc";
67+
} else {
68+
order = "asc";
69+
gOrderBy = column;
70+
gTable.setAttribute("order-by", column);
71+
gRows.sort(compareRows);
72+
}
73+
gTable.removeChild(gTBody);
74+
gTable.setAttribute("order", order);
75+
if (order == "asc")
76+
for (var i = 0; i < gRows.length; i++)
77+
gTBody.appendChild(gRows[i]);
78+
else
79+
for (var i = gRows.length - 1; i >= 0; i--)
80+
gTBody.appendChild(gRows[i]);
81+
gTable.appendChild(gTBody);
82+
}
83+
function updateHidden() {
84+
gTable.className = gUI_showHidden.getElementsByTagName("input")[0].checked ?
85+
"" :
86+
"remove-hidden";
87+
}
88+
})();

src/manifest.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@
8989
"content/webglHook.js",
9090
"content/media.js"
9191
]
92+
},
93+
{
94+
"run_at": "document_start",
95+
"matches": ["ftp://*/*"],
96+
"js": [
97+
"content/ftp.js"
98+
]
9299
}
93100
],
94101

0 commit comments

Comments
 (0)