a canvas reads back the same through toDataURL and getImageData
Check id canvas-todataurl-vs-getimagedata
What an ordinary browser yields
Every channel identical between getImageData and the decoded PNG (severity: warn).
What a detector infers
toDataURL and getImageData are two exits from one canvas, and PNG is lossless, so decoding the data URL back into pixels has to reproduce what getImageData already returned, byte for byte. There is no reference image and no baseline anywhere in that statement - the canvas is compared only against itself. It exists alongside the other pixel rows because all of those read through getImageData, which means a farble applied ONLY to toDataURL leaves every one of them satisfied: the canvas really does contain what they asked for. And toDataURL is the surface most likely to be perturbed, because it is what fingerprinting scripts actually hash. Measured on a real browser: a toDataURL shim perturbing a single pixel passed canvas-tamper, canvas-flat-fill-uniform, canvas-subrect-consistency and worker-vs-main, and was caught only by an identity check noticing the patched native - behaviourally it was invisible. Stock reproduces all 4096 channels with zero differences; the shimmed canvas differed in two channels by one.
How to resolve it
toDataURL and getImageData read the same backing store and PNG encoding is lossless, so a round trip has to reproduce what getImageData returned. Perturbing only toDataURL leaves the pixel-level checks satisfied while the two exits disagree with each other. Farble both identically, or neither.
Nearby checks in Render & GPU
- WebGL1 and WebGL2 report the same UNMASKED GPU
webgl1-webgl2-coherenceThe check creates a WebGL1 context and a WebGL2 context and reads UNMASKED_VENDOR_WEBGL / UNMASKED_RENDERER_WEBGL from each through the… - canvas readback is not noise-injected (1×1 probe)
canvas-tamperThe probe fills a single pixel with pure black on a 1x1 canvas and reads it straight back with getImageData. - one flat fill reads back as exactly one colour
canvas-flat-fill-uniformThis is the area form of the 1×1 canvas probe, and it exists because that probe is easy to pass by accident. - one pixel reads the same through a full read and a windowed read
canvas-subrect-consistencyThe same pixels, asked for twice through different windows. A full-canvas read and an inner 16×16 read overlap on 256 pixels, and those are… - one WebGL clear reads back as exactly one colour
webgl-readback-flat-uniformA single glClear writes one colour into every pixel of the framebuffer, so reading that framebuffer back must yield exactly one colour. - a WebGL framebuffer reads back the same through readPixels and toDataURL
webgl-readpixels-vs-todataurlreadPixels and toDataURL both read the drawing buffer of one WebGL canvas, and PNG is lossless, so decoding the data URL has to reproduce… - WebGL and WebGPU agree on whether this device clears uniformly
webgl-webgpu-readback-agreeOne clear, two GPU APIs, one adapter. WebGL paints a flat colour and reads it back with readPixels; WebGPU renders the same clear into a… - canvas measureText widths on the 1/512 sub-pixel grid
measuretext-gridChrome's 2D text metrics are quantised: advance widths are computed in fixed-point and land on a dyadic 1/512-pixel grid.
Clearcote is a browser built for fingerprint coherence
It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.
This audit takes no position on how Clearcote scores on Render & GPU checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.
See the other checks in Render & GPU — the family canvas-todataurl-vs-getimagedata belongs to.