diff --git a/src/main.js b/src/main.js index 6a7506b..c276641 100644 --- a/src/main.js +++ b/src/main.js @@ -16,17 +16,41 @@ function loadRomData(name) { return request.response; } -function resetLoadAndStart(filename, romdata) { +function updateUrl(params) { + const url = new URL(window.location.href); + // Clear hash and query params so hash-based legacy URLs don't override new state + url.hash = ""; + for (const key of [...url.searchParams.keys()]) { + url.searchParams.delete(key); + } + for (const [key, val] of Object.entries(params)) { + if (val !== null) url.searchParams.set(key, val); + } + history.replaceState(null, "", url); +} + +/** Return a ROM name only if it is in the known ROM list; null otherwise. */ +function sanitizeRomName(name) { + if (!name) return null; + return RomList.includes(name) ? name : null; +} + +function resetLoadAndStart(filename, romdata, urlParams) { miracle_reset(); bus.loadRom(filename, romdata, debug_init); hideRomChooser(); start(); + updateUrl(urlParams ?? { load: filename }); } function loadUploadFile(file) { const reader = new FileReader(); reader.onload = function () { - resetLoadAndStart(file.name, reader.result); + const b64 = btoa(reader.result); + resetLoadAndStart(file.name, reader.result, { + b64sms: b64, + load: file.name, + }); }; reader.readAsBinaryString(file); } @@ -129,7 +153,19 @@ function go() { const parsedQuery = parseQuery(); if (parsedQuery["b64sms"]) { - bus.loadRom("b64.sms", atob(parsedQuery["b64sms"]), debug_init); + const name = parsedQuery["load"] || "uploaded.sms"; + bus.loadRom(name, atob(parsedQuery["b64sms"]), debug_init); + updateUrl({ b64sms: parsedQuery["b64sms"], load: name }); + } else if (parsedQuery["load"]) { + const name = sanitizeRomName(parsedQuery["load"]); + if (name) { + bus.loadRom(name, loadRomData(name), debug_init); + updateUrl({ load: name }); + } else { + // Unknown/invalid ROM name — fall through to default + const defaultRom = getDefaultRom(); + bus.loadRom(defaultRom, loadRomData(defaultRom), debug_init); + } } else { const defaultRom = getDefaultRom(); bus.loadRom(defaultRom, loadRomData(defaultRom), debug_init);