remove TAB/console and TAB/execute-script which are ugly

(and not really necessary now that we have evals, I think? like, as
long as you have some way to run JS on the content script, you can
build other functionality out of that)
This commit is contained in:
Omar Rizwan 2021-02-22 16:31:30 -08:00
parent ad80383242
commit 063051d80b
2 changed files with 8 additions and 84 deletions

View file

@ -246,87 +246,6 @@ router["/tabs/by-id"] = {
// being "truee" (if it was "false", then someone wrote "true")
buf => ({ active: buf.startsWith("true") }));
})();
(function() {
let nextConsoleFh = 0; let consoleForFh = {};
chrome.runtime.onMessage.addListener(data => {
if (!consoleForFh[data.fh]) return;
consoleForFh[data.fh].push(data.xs);
});
router["/tabs/by-id/*/console"] = {
// this one is a bit weird. it doesn't start tracking until it's opened.
// tail -f console
async getattr() {
return {
st_mode: unix.S_IFREG | 0444,
st_nlink: 1,
st_size: 0 // FIXME
};
},
async open({path}) {
const tabId = parseInt(pathComponent(path, -2));
const fh = nextConsoleFh++;
const code = `
// runs in 'content script' context
var script = document.createElement('script');
var code = \`
// will run both here in content script context and in
// real Web page context (so we hook console.log for both)
(function() {
if (!console.__logOld) console.__logOld = console.log;
if (!console.__logFhs) console.__logFhs = new Set();
console.__logFhs.add(${fh});
console.log = (...xs) => {
console.__logOld(...xs);
try {
// TODO: use random event for security instead of this broadcast
for (let fh of console.__logFhs) {
window.postMessage({fh: ${fh}, xs: xs}, '*');
}
// error usually if one of xs is not serializable
} catch (e) { console.error(e); }
};
})()
\`;
eval(code);
script.appendChild(document.createTextNode(code));
(document.body || document.head).appendChild(script);
window.addEventListener('message', function({data}) {
if (data.fh !== ${fh}) return;
// forward to the background script
chrome.runtime.sendMessage(null, data);
});
`;
consoleForFh[fh] = [];
await browser.tabs.executeScript(tabId, {code});
return {fh};
},
async read({path, fh, offset, size}) {
const all = consoleForFh[fh].join('\n');
// TODO: do this more incrementally ?
// will probably break down if log is huge
const buf = String.fromCharCode(...toUtf8Array(all).slice(offset, offset + size));
return { buf };
},
async release({path, fh}) {
const tabId = parseInt(pathComponent(path, -2));
// TODO: clean up the hooks inside the contexts
delete consoleForFh[fh];
return {};
}
};
})();
router["/tabs/by-id/*/execute-script"] = {
// note: runs in a content script, _not_ in the Web page context
async write({path, buf}) {
// FIXME: chunk this properly (like if they write a script in
// multiple chunks) and only execute when ready?
const tabId = parseInt(pathComponent(path, -2));
await browser.tabs.executeScript(tabId, {code: buf});
return {size: stringToUtf8Array(buf).length};
},
async truncate({path, size}) { return {}; }
};
(function() {
let evals = {};
router["/tabs/by-id/*/evals"] = {

View file

@ -165,11 +165,16 @@ could do in the first place)
$ cat mnt/tabs/by-id/*/text.txt > text-of-all-tabs.txt
```
### Run script
### [Evaluate JavaScript on a page](https://twitter.com/rsnous/status/1364008241588363264)
```
$ echo 'document.body.style.background = "green"' > mnt/tabs/last-focused/execute-script
$ echo 'alert("hi!")' > mnt/tabs/last-focused/execute-script
$ touch mnt/tabs/last-focused/evals/'document.body.style.background = "green"'
$ touch mnt/tabs/last-focused/evals/'alert("hi!")'
$ touch mnt/tabs/last-focused/evals/'2 + 2'
$ cat mnt/tabs/last-focused/evals/'2 + 2'
4
```
### Get images / scripts / other resource files from page