Skip to content
All fingerprint checksEnvironment & locale

mimeTypes are consistent with navigator.plugins

Check id plugins-mimetypes

What an ordinary browser yields

Every mimeType maps back to a plugin object that is present in navigator.plugins — a fully closed graph.

What a detector infers

This walks `navigator.mimeTypes`, and for each entry reads `.enabledPlugin` and checks that the exact object is present in a Set built from `navigator.plugins`. It counts entries whose enabledPlugin is null or is an object absent from the plugin list. This tests object identity, not string equality: in real Chrome the two collections are two views over one internal registry, so every mimeType's enabledPlugin is necessarily the same object instance found in navigator.plugins. Spoofs that fabricate the two arrays independently — a common way to 'fill in' plugins — produce entries that point at nothing, or at plugin objects that do not appear in the list. N/A when there are no mimeTypes to check.

How to resolve it

Do not synthesise navigator.plugins and navigator.mimeTypes as separate JS arrays. Let the real plugin registry populate both, so the cross-references resolve to the same objects; if you must present a plugin set, it has to be wired at the engine level where both views share one backing store.

What is codec fingerprinting?

Read in the wild by

PerimeterX / HUMAN

Brand-checks navigator.mimeTypes.toString() against "[object MimeTypeArray]" and navigator.plugins.toString() against "[object PluginArray]", and ships mimeTypes.length in the same payload as the resolved plugin name list.

main.min.js `CE(){…return t[198]=hU.mimeTypes&&hU[hQ(894)].toString(),t[198]===hQ(895)||new RegExp(hQ(896),"i")[hQ(236)](t[198])}` where hU=navigator, hQ(894)='mimeTypes', hQ(895)='[object MimeTypeArray]', hQ(896)='MSMimeTypesCollection' → payload field "OSUMb39IDFQ=" = true; the plugins twin CB() runs `gQ=hU.plugins[hQ(247)]()` then `gQ===hQ(892)||"[object MSPluginsCollection]"===gQ||gQ===hQ(893)` with hQ(892)='[object PluginArray]', hQ(893)='[object HTMLPluginsCollection]'; `t[0]["ViZjLBNDZBo="]=hU.mimeTypes&&hU.mimeTypes.length||-1` = 2, shipped alongside "T386NQoaPg4=" = ["PDF Viewer","Chrome PDF Viewer","Chromium PDF Viewer","Microsoft Edge PDF Viewer","WebKit built-in PDF"]

CreepJS

CreepJS, an open-source research demo rather than a production detector, walks the plugins/mimeTypes graph in both directions in `getPluginLies`: it maps each mimeType's `enabledPlugin` back against the plugin list to decide which plugin names it still trusts, and separately emits a "missing mimetype" lie when a plugin's first entry is not a genuine `MimeType` instance and an "invalid mimetype" lie when a plugin's mimetype is absent from `navigator.mimeTypes`.

src/lies/index.ts `getPluginLies(plugins: PluginArray, mimeTypes: MimeTypeArray)`: `const mimeTypeEnabledPlugins = excludeDuplicates(mimeTypesList.map((mimeType) => mimeType.enabledPlugin))` narrows `trustedPluginNames` (seeded from `pluginsOwnPropertyNames`); `lies.push('missing mimetype')` fires when `Object.getPrototypeOf(plugin[0]).constructor.name == 'MimeType'` fails; `lies.push('invalid mimetype')` fires when a plugin's `mimetype.type` is not in `trustedMimeTypes` (seeded from `mimeTypesOwnPropertyNames`)

Kasada

Reads the plugin list, its descriptors and the MIME-type table.

window_plugins_descriptor, window_plugins_list, navigator_plugins, navigator_mime_types, iframe_plugins_descriptor

ips.js 427-probe teardown (emro.cat, Apr 2026)

DataDome

Ships the resolved plugin name list.

l0GauR = "PDF Viewer,Chrome PDF Viewer,Chromium PDF Viewer,Microsoft Edge PDF Viewer,WebKit built-in PDF"

glizzykingdreko/datadome-encryption — tests/original.json

Akamai

Lists plugin enumeration and MIME types as browser-fingerprint signals.

signal_categories.md - 1. Browser Fingerprint - Plugin enumeration

Edioff/akamai-analysis — signal_categories.md

Every attribution traces to a published artifact. See the sources and their limits.

Nearby checks in Environment & locale

See all 23 checks in Environment & locale
Who builds this test

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 plugins-mimetypes belongs to.