- From: Brian Cardarella <notifications@github.com>
- Date: Sun, 04 Oct 2026 06:10:13 -0700
- To: w3c/FileAPI <FileAPI@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/FileAPI/issues/226@github.com>
bcardarella created an issue (w3c/FileAPI#226)
The serialization and deserialization steps for `Blob` and `File` don't carry the `type` attribute, but every engine keeps it and WPT asserts it.
### What the spec says
[Blob's serialization steps](https://w3c.github.io/FileAPI/#blob-section) set `serialized.[[SnapshotState]]` and `serialized.[[ByteSequence]]`, and the deserialization steps restore only those two. [File's steps](https://w3c.github.io/FileAPI/#file-section) add `[[Name]]` and `[[LastModified]]`. None of the four algorithms mentions `type`, so read literally:
```js
structuredClone(new Blob(["x"], { type: "text/plain" })).type // "" by the spec text
structuredClone(new File(["x"], "a.txt", { type: "text/plain" })).type // "" by the spec text
```
The same holds for `postMessage`, `history.pushState`, and IndexedDB's StructuredSerializeForStorage.
### What engines do
All three keep the type (`"text/plain"` above):
- Blink: `V8ScriptValueSerializer::WriteDOMObject` writes the blob's uuid, type and size (`kBlobTag`), and File's type with its other fields.
- WebKit: [`SerializedScriptValue.cpp`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/bindings/js/SerializedScriptValue.cpp): `CloneSerializer` writes `blob->type()` after the URL (`BlobTag`) and `file.type()` (`FileTag`), and `readFile` passes the type to `File::deserialize`.
- Gecko: [`StructuredCloneHolder.cpp`](https://searchfox.org/mozilla-central/source/dom/base/StructuredCloneHolder.cpp): `WriteBlob` keeps a reference to the `BlobImpl` (which holds the content type), and `ReadBlob` wraps the same impl, so the type carries over.
### Tests
WPT's `compare_Blob` (`html/webappapis/structured-clone/structured-clone-battery-of-tests.js`) asserts `actual.type === input.type` for every cloned Blob and File, across the structured-clone, postMessage and IndexedDB variants.
### Proposal
- Blob serialization steps: add "Set `serialized.[[Type]]` to the value of `value`'s `type` attribute."
- Blob deserialization steps: add "Initialize the value of `value`'s `type` attribute to `serialized.[[Type]]`."
- File serialization and deserialization steps: the same two steps.
Possibly related: #98 (whether a clone copies or references the data), which doesn't cover `type`.
Found while implementing structured serialization for Blob and File in [Crane](https://github.com/zig-whatwg/crane), a web platform engine, which keeps the type as the engines do.
--
Reply to this email directly or view it on GitHub:
https://github.com/w3c/FileAPI/issues/226
You are receiving this because you are subscribed to this thread.
Message ID: <w3c/FileAPI/issues/226@github.com>
Received on Sunday, 4 October 2026 13:10:17 UTC