improve scripts dir -- checking scriptId more reliably. add tests

This commit is contained in:
Omar Rizwan 2020-12-29 04:27:12 -08:00
parent 705b245be5
commit 8315efcb60
2 changed files with 28 additions and 9 deletions

View file

@ -58,11 +58,11 @@ const TabManager = (function() {
console.log(source, method, params); console.log(source, method, params);
if (method === "Page.frameStartedLoading") { if (method === "Page.frameStartedLoading") {
// we're gonna assume we're always plugged into both Page and Debugger. // we're gonna assume we're always plugged into both Page and Debugger.
TabManager.scriptsForTab[source.tabId] = []; TabManager.scriptsForTab[source.tabId] = {};
} else if (method === "Debugger.scriptParsed") { } else if (method === "Debugger.scriptParsed") {
TabManager.scriptsForTab[source.tabId] = TabManager.scriptsForTab[source.tabId] || []; TabManager.scriptsForTab[source.tabId] = TabManager.scriptsForTab[source.tabId] || {};
TabManager.scriptsForTab[source.tabId].push(params); TabManager.scriptsForTab[source.tabId][params.scriptId] = params;
} }
}); });
@ -82,7 +82,7 @@ const TabManager = (function() {
}, },
enableDomainForTab: async function(tabId, domain) { enableDomainForTab: async function(tabId, domain) {
// TODO: could we remember if we're already enabled? idk if it's worth it // TODO: could we remember if we're already enabled? idk if it's worth it
if (domain === 'Debugger') { TabManager.scriptsForTab[tabId] = []; } if (domain === 'Debugger') { TabManager.scriptsForTab[tabId] = {}; }
await sendDebuggerCommand(tabId, `${domain}.enable`, {}); await sendDebuggerCommand(tabId, `${domain}.enable`, {});
} }
}; };
@ -288,18 +288,24 @@ router["/tabs/by-id/*/control"] = {
}, },
async readdir({path}) { async readdir({path}) {
const tabId = parseInt(pathComponent(path, -3)); const tabId = parseInt(pathComponent(path, -3));
return { entries: [".", "..", ...TabManager.scriptsForTab[tabId].map(params => sanitize(params.url).slice(0, 200) + "_" + params.scriptId)] }; // it's useful to put the ID first so:
// 1. the .js extension stays on the end
// 2. file prefixes like Emacs temp files, Emacs looking for file with SCCS s. prefix, etc all are clearly invalid automatically
const scriptFileNames = Object.values(TabManager.scriptsForTab[tabId])
.map(params => params.scriptId + "_" + sanitize(params.url).slice(0, 200));
return { entries: [".", "..", ...scriptFileNames] };
} }
}; };
router["/tabs/by-id/*/debugger/scripts/*"] = defineFile(async path => { router["/tabs/by-id/*/debugger/scripts/*"] = defineFile(async path => {
const [tabId, suffix] = [parseInt(pathComponent(path, -4)), pathComponent(path, -1)]; const [tabId, suffix] = [parseInt(pathComponent(path, -4)), pathComponent(path, -1)];
await TabManager.debugTab(tabId); await TabManager.debugTab(tabId);
console.log('BEFORE', TabManager.scriptsForTab[tabId].length);
await TabManager.enableDomainForTab(tabId, "Page"); await TabManager.enableDomainForTab(tabId, "Page");
await TabManager.enableDomainForTab(tabId, "Debugger"); await TabManager.enableDomainForTab(tabId, "Debugger");
console.log('AFTER', TabManager.scriptsForTab[tabId].length)
const parts = path.split("_"); const scriptId = parts[parts.length - 1]; const parts = pathComponent(path, -1).split("_"); const scriptId = parts[0];
// TODO: check the script title in path vs the actual script title
if (!TabManager.scriptsForTab[tabId][scriptId]) { throw new UnixError(unix.ENOENT); }
const {scriptSource} = await sendDebuggerCommand(tabId, "Debugger.getScriptSource", {scriptId}); const {scriptSource} = await sendDebuggerCommand(tabId, "Debugger.getScriptSource", {scriptId});
return scriptSource; return scriptSource;
@ -307,7 +313,10 @@ router["/tabs/by-id/*/control"] = {
const [tabId, suffix] = [parseInt(pathComponent(path, -4)), pathComponent(path, -1)]; const [tabId, suffix] = [parseInt(pathComponent(path, -4)), pathComponent(path, -1)];
await TabManager.debugTab(tabId); await TabManager.enableDomainForTab(tabId, "Debugger"); await TabManager.debugTab(tabId); await TabManager.enableDomainForTab(tabId, "Debugger");
const parts = path.split("_"); const scriptId = parts[parts.length - 1]; const parts = path.split("_"); const scriptId = parts[0];
// TODO: check the script title in path vs the actual script title
if (!TabManager.scriptsForTab[tabId][scriptId]) { throw new UnixError(unix.ENOENT); }
await sendDebuggerCommand(tabId, "Debugger.setScriptSource", {scriptId, scriptSource: buf}); await sendDebuggerCommand(tabId, "Debugger.setScriptSource", {scriptId, scriptSource: buf});
}); });
})(); })();

View file

@ -1,6 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h> #include <unistd.h>
#include <assert.h> #include <assert.h>
@ -44,6 +46,14 @@ int main() {
assert(system("ls ../fs/mnt/tabs/last-focused/debugger/scripts") == 0); assert(system("ls ../fs/mnt/tabs/last-focused/debugger/scripts") == 0);
{
DIR* scripts = opendir("../fs/mnt/tabs/last-focused/debugger/scripts");
assert(strcmp(readdir(scripts)->d_name, ".") == 0);
assert(strcmp(readdir(scripts)->d_name, "..") == 0);
assert(strcmp(readdir(scripts)->d_name, "7_file____Users_osnr_Code_tabfs_test_test-script.js") == 0);
closedir(scripts);
}
assert(system("echo remove > ../fs/mnt/tabs/last-focused/control") == 0); assert(system("echo remove > ../fs/mnt/tabs/last-focused/control") == 0);
} }