Skip to content
All fingerprint checksNative function integrity

every navigator accessor and method is native, not just the well-known ones

Check id navigator-prototype-fully-native

What an ordinary browser yields

Every accessor and method on Navigator.prototype reporting native code, and no prototype accessor shadowed by an own property on the navigator instance (severity: warn).

What a detector infers

navigator-descriptors asks whether seven named properties resolve through native prototype getters. This asks the same question of EVERY property on Navigator.prototype, by enumerating it. The difference matters because a list is a guess about which properties a spoofer will reach for: patch oscpu, vendorSub, pdfViewerEnabled or any of the thirty-odd accessors outside that list and every other row on this page stays green. The check reads each descriptor and asserts only on what should be native code - accessors and methods - so constructor and Symbol.toStringTag, which are ordinary data properties on a stock browser, are not flagged. It also catches the classic instance shadow (an own property on navigator hiding a prototype accessor) across the whole surface rather than for seven names. Enumeration is what keeps it from rotting: there is no list to maintain, whatever the browser puts on Navigator.prototype is what gets checked, so a property introduced in a future Chrome is covered the day it ships, and "[native code]" is the browser's own claim about its own function rather than a value compared against a corpus. PROVENANCE: this row exists because a commercial fingerprinting service was measured posting its own enumeration of Navigator.prototype - every property paired with its getter's toString, around 5.6KB of it - while this page sampled seven. It was asking a strictly harder question of the same object, and the gap was not a technique we lacked but a loop we had not written.

How to resolve it

Change navigator values at the engine level rather than from page script. Any userland override - Object.defineProperty on the prototype, or an own property on the instance - leaves a function whose toString is JavaScript, and enumeration finds it wherever it is rather than only where a hardcoded list happened to look. Note that a privacy extension patching a navigator getter produces the same shape, which is why this is a warn and why the row names the properties instead of asserting a cause.

Nearby checks in Native function integrity

See all 14 checks in Native function integrity
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 Native function integrity 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 Native function integrity — the family navigator-prototype-fully-native belongs to.