Skip to content
All fingerprint checksNavigator identity

no other engine's properties exist on this one, even holding undefined

Check id legacy-engine-props-absent

What an ordinary browser yields

None of the probed Gecko or legacy-IE members exists on a Chromium build — not with a value, and not holding undefined.

What a detector infers

There is a difference between a property that returns undefined and a property that does not exist, and only one of them is what a real browser gives. On Chromium, `'oscpu' in navigator` is false — the member belongs to Gecko and was never compiled in. A persona script that wants to look like Chrome will happily assign `navigator.oscpu = undefined`, or define a getter that returns undefined, and the VALUE then matches a real Chrome exactly. The existence does not: `in` and getOwnPropertyDescriptor both see the assignment, and no amount of returning the right value hides that the property is there. The same holds for the legacy-IE members (cpuClass, appMinorVersion, systemLanguage, userLanguage, msDoNotTrack, document.documentMode), for window.ActiveXObject and window.netscape, and for Gecko's mozRTCPeerConnection and mozInnerScreenX. The row also catches the blunter failure — a foreign member present with a real value behind a Chromium user agent, which is what a persona assembled from another engine's property bag looks like. It reads a Blink build only, since the list is defined as the set of things Blink does not have.

How to resolve it

Never assign a foreign engine's property, not even to undefined: the assignment is what is visible, and a real Chromium answers false to `in`. A property that should be absent must simply never be created, and one that should exist belongs in the engine rather than on the page's navigator.

Read in the wild by

FakeBrowser (collector)

Records a distinct sentinel for 'exists but undefined' (_$obj!_undefined_//+_) separately from absent, over a property list full of Gecko and legacy-IE members — buildID, oscpu, cpuClass, appMinorVersion, systemLanguage, userLanguage, msDoNotTrack, ActiveXObject, netscape, mozRTCPeerConnection, documentMode, layers.

dumpObjProps() sentinels + dumpNavigatorProps/dumpWindowProps/dumpDocumentProps key lists, script/dumpDD.js

kkoooqq/fakebrowser script/dumpDD.js

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

Nearby checks in Navigator identity

See all 29 checks in Navigator identity
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 Navigator identity 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 Navigator identity — the family legacy-engine-props-absent belongs to.