[w3c/FileAPI] Blob and File serialization steps drop the type attribute (all engines keep it; WPT asserts it) (Issue #226)

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