From d0fd1b05fc7dd74ebe439e63ca1a8d79ce0538ce Mon Sep 17 00:00:00 2001 From: ShuaixinHuang <1836656514@qq.com> Date: Mon, 9 Nov 2026 05:50:33 +0800 Subject: [PATCH] fix(qlog): mark non-string frame types incomplete (#9433) * fix(qlog): mark non-string frame types incomplete * test(ghidra): assert current provider limitations --- src/browser/history/QlogCapture.test.ts | 15 +++++++++++++++ src/browser/history/QlogCapture.ts | 6 +----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/browser/history/QlogCapture.test.ts b/src/browser/history/QlogCapture.test.ts index bb2a7f00e6..9224bfc3b7 100644 --- a/src/browser/history/QlogCapture.test.ts +++ b/src/browser/history/QlogCapture.test.ts @@ -134,6 +134,21 @@ it("keeps incomplete fields unknown and FIN without bytes as metadata", () => { expect(traces[0]?.loss_declarations[0]?.packet_number.state).toBe("unknown"); }); +it("marks non-string frame types incomplete without hiding their recorded values", () => { + const { decoded, traces } = facts( + capture([ + event([{ frame_type: 0 }, frame(0, 5)]), + event([{ frame_type: false }], "transport:packet_received"), + event([{ frame_type: "extension:custom" }]), + ]), + ); + expect(traces[0]?.incomplete_fact_records).toEqual([0, 1]); + expect(traces[0]?.streams[0]?.unique_bytes).toBe("5"); + expect(decoded.records[0]?.reported).toMatchObject({ + data: { frames: [{ frame_type: 0 }, frame(0, 5)] }, + }); +}); + it.each([ { fin: undefined, incomplete: [0] }, { fin: null, incomplete: [0] }, diff --git a/src/browser/history/QlogCapture.ts b/src/browser/history/QlogCapture.ts index 61f09804b0..e8170d15fe 100644 --- a/src/browser/history/QlogCapture.ts +++ b/src/browser/history/QlogCapture.ts @@ -264,11 +264,7 @@ const collectTransportFacts = ( return; } for (const [frameIndex, frame] of data.frames.entries()) { - if ( - !object(frame) || - frame.frame_type === undefined || - frame.frame_type === null - ) { + if (!object(frame) || typeof frame.frame_type !== "string") { fact.incomplete_fact_records.push(ordinal); continue; }