canPlayType answers identically for <video>, <audio> and the prototype
Check id canplaytype-element-agnostic
What an ordinary browser yields
All 8 MIME strings return the same answer via <video>, <audio> and the prototype.
What a detector infers
canPlayType is implemented exactly once, on HTMLMediaElement.prototype, so <video> and <audio> inherit the same C++ function. This check asks eight MIME strings (H.264, AAC, bare video/mp4, audio/mpeg, VP8+Vorbis, VP9, Ogg Vorbis, WAV) three ways: through a <video> element, through an <audio> element, and through a saved HTMLMediaElement.prototype.canPlayType reference invoked with the video element as its receiver. On a genuine engine all three routes reach the same code and return identical strings, so any divergence is structural: it means the answers are being produced somewhere other than the shared implementation — a hook keyed on tagName, or a patch applied to HTMLVideoElement.prototype that never reached the HTMLMediaElement.prototype every element actually inherits from. A detector can infer from a single disagreement that codec answers are synthesized in JS, without needing to know which codecs the host really supports. Severity is critical because the contradiction is internal and needs no reference data to read.
How to resolve it
Never key canned codec answers off element type or patch only HTMLVideoElement.prototype. If codec answers must be changed, change them at the one place the engine implements them — HTMLMediaElement.prototype — so every element and every call route inherits the same result. Probes that ask a video element about audio codecs are routine, and an element-agnostic implementation answers them for free.
Nearby checks in Environment & locale
- Blink-only Web APIs present for a Chrome UA
blink-web-apisWhen the UA matches Chrome/\d+ and the page is a secure context, this probes four Blink-only surfaces: navigator.connection… - CSS feature support matches the engine (Blink for a Chrome UA)
css-engine-surfaceFor any UA containing 'Chrome/', this requires CSS.supports('-webkit-app-region', 'drag') to be true and the Gecko markers — MozAppearance… - every Intl constructor resolves the same locale
intl-locale-coherenceEvery Intl constructor — NumberFormat, DateTimeFormat, PluralRules, Collator — resolves its locale through the same underlying ICU data, so… - navigator.plugins is a real platform object (structured-clone probe)
plugins-structured-cloneThe structured-clone algorithm is implemented in C++ and interrogates objects about what they actually are, not what they claim. - canPlayType behaves like a real codec parser (bogus + quoting)
canplaytype-parser-trapsA real canPlayType is an RFC-6381 parser, not a dictionary. This check exercises two properties only a parser has. - AudioContext invariants + a deterministic offline render
audio-context-coherenceThe check constructs a live AudioContext and reads four invariants — sampleRate, baseLatency, the destination node's channelCount against… - the analyser byte spectrum is the defined quantisation of its float spectrum
audio-analyser-float-vs-byteAn AnalyserNode publishes the same spectrum twice. getFloatFrequencyData returns decibels, and getByteFrequencyData returns that spectrum… - speech synthesis voices (host OS speech engine)
speech-voicesspeechSynthesis.getVoices() enumerates the host operating system's speech engine — a resource stealth stacks essentially never touch, which…
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 Environment & locale 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 Environment & locale — the family canplaytype-element-agnostic belongs to.