diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-08-04 18:22:09 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-08-07 00:48:32 -0700 |
| commit | db69641061ae300baabd6107aa22da60e78f0f38 (patch) | |
| tree | b92197b59df8cefaee4c9dd545726314c2be9ef8 /lib/fuzzer | |
| parent | e64a00950e7ec505fdcdb53da265828d1263bc22 (diff) | |
| download | zig-db69641061ae300baabd6107aa22da60e78f0f38.tar.gz zig-db69641061ae300baabd6107aa22da60e78f0f38.zip | |
fuzzing web ui: make entry point links clickable
Diffstat (limited to 'lib/fuzzer')
| -rw-r--r-- | lib/fuzzer/main.js | 50 | ||||
| -rw-r--r-- | lib/fuzzer/wasm/main.zig | 27 |
2 files changed, 68 insertions, 9 deletions
diff --git a/lib/fuzzer/main.js b/lib/fuzzer/main.js index 3efd20ca9d..ac3a06ca5e 100644 --- a/lib/fuzzer/main.js +++ b/lib/fuzzer/main.js @@ -15,6 +15,8 @@ return response.arrayBuffer(); }); var wasm_exports = null; + var curNavSearch = null; + var curNavLocation = null; const text_decoder = new TextDecoder(); const text_encoder = new TextEncoder(); @@ -47,11 +49,52 @@ wasm_array.set(js_array); wasm_exports.unpack(ptr, js_array.length); + window.addEventListener('popstate', onPopState, false); + onHashChange(null); + domStatus.textContent = "Waiting for server to send source location metadata..."; connectWebSocket(); }); }); + function onPopState(ev) { + onHashChange(ev.state); + } + + function onHashChange(state) { + history.replaceState({}, ""); + navigate(location.hash); + if (state == null) window.scrollTo({top: 0}); + } + + function navigate(location_hash) { + curNavLocation = null; + curNavSearch = null; + + if (location_hash.length > 1 && location_hash[0] === '#') { + const query = location_hash.substring(1); + const qpos = query.indexOf("?"); + let nonSearchPart; + if (qpos === -1) { + nonSearchPart = query; + } else { + nonSearchPart = query.substring(0, qpos); + curNavSearch = decodeURIComponent(query.substring(qpos + 1)); + } + + if (nonSearchPart.length > 0) { + curNavLocation = nonSearchPart; + } + } + + render(); + + if (curNavLocation != null) { + // TODO + // scrollToSourceLocation(findSourceLocationIndex(curNavLocation)); + } + } + function connectWebSocket() { const host = window.document.location.host; const pathname = window.document.location.pathname; @@ -104,8 +147,9 @@ domStatus.classList.add("hidden"); domSectSource.classList.add("hidden"); - // TODO this is temporary debugging data - renderSource("/home/andy/dev/zig/lib/std/zig/tokenizer.zig"); + if (curNavLocation != null) { + renderSource(curNavLocation.split(":")[0]); + } } function renderStats() { @@ -122,7 +166,7 @@ resizeDomList(domEntryPointsList, entryPoints.length, "<li></li>"); for (let i = 0; i < entryPoints.length; i += 1) { const liDom = domEntryPointsList.children[i]; - liDom.innerText = unwrapString(wasm_exports.sourceLocationLinkHtml(entryPoints[i])); + liDom.innerHTML = unwrapString(wasm_exports.sourceLocationLinkHtml(entryPoints[i])); } diff --git a/lib/fuzzer/wasm/main.zig b/lib/fuzzer/wasm/main.zig index a95c0b84cf..3226527f3a 100644 --- a/lib/fuzzer/wasm/main.zig +++ b/lib/fuzzer/wasm/main.zig @@ -4,6 +4,7 @@ const abi = std.Build.Fuzz.abi; const gpa = std.heap.wasm_allocator; const log = std.log; const Coverage = std.debug.Coverage; +const Allocator = std.mem.Allocator; const Walk = @import("Walk"); const Decl = Walk.Decl; @@ -263,12 +264,26 @@ fn updateCoverage( } export fn sourceLocationLinkHtml(index: u32) String { - const sl = coverage_source_locations.items[index]; - const file_name = coverage.stringAt(coverage.fileAt(sl.file).basename); - string_result.clearRetainingCapacity(); - string_result.writer(gpa).print("{s}:{d}:{d}", .{ - file_name, sl.line, sl.column, - }) catch @panic("OOM"); + sourceLocationLinkHtmlFallible(index, &string_result) catch @panic("OOM"); return String.init(string_result.items); } + +fn sourceLocationLinkHtmlFallible(index: u32, out: *std.ArrayListUnmanaged(u8)) Allocator.Error!void { + const sl = coverage_source_locations.items[index]; + const file = coverage.fileAt(sl.file); + const file_name = coverage.stringAt(file.basename); + const dir_name = coverage.stringAt(coverage.directories.keys()[file.directory_index]); + + out.clearRetainingCapacity(); + try out.appendSlice(gpa, "<a href=\"#"); + _ = html_render.missing_feature_url_escape; + try out.writer(gpa).print("{s}/{s}:{d}:{d}", .{ + dir_name, file_name, sl.line, sl.column, + }); + try out.appendSlice(gpa, "\">"); + try html_render.appendEscaped(out, dir_name); + try out.appendSlice(gpa, "/"); + try html_render.appendEscaped(out, file_name); + try out.writer(gpa).print(":{d}:{d}</a>", .{ sl.line, sl.column }); +} |
