Skip to content
All fingerprint checksEnvironment & locale

CSS feature support matches the engine (Blink for a Chrome UA)

Check id css-engine-surface

What an ordinary browser yields

-webkit-app-region supported, no Moz* properties in the style registry, for any Chrome UA.

What a detector infers

For any UA containing 'Chrome/', this requires `CSS.supports('-webkit-app-region', 'drag')` to be true and the Gecko markers — `MozAppearance` in the inline style object, or `CSS.supports('-moz-user-focus', 'normal')` — to be absent. The CSS property registry is compiled into the engine: which vendor-prefixed properties parse is decided at build time and surfaced through CSS.supports and the CSSStyleDeclaration shape. That gives a detector an engine identity check that runs entirely below the JS-spoofing layer — a Gecko browser wearing a Chrome UA still answers Blink's questions with Gecko's property table. N/A for non-Chrome UAs.

How to resolve it

Present a UA that matches the engine. This surface is compiled in and cannot be re-skinned from JS — adding shims for individual properties does not change what CSS.supports reports for the rest of the registry.

Identifying the engine behind the User-Agent

Read in the wild by

Kasada

It profiles the CSS engine by enumerating an element's inline style object — Object.keys on the style of a created 'invalidTag' element, falling back to the prototype's keys — then buckets every name by its leading prefix and reports a count per family. 49 of those buckets ride as their own payload slots, including the vendor-prefix families moz, webkit, ms and epub.

49 css_* probes in probes.txt including css_moz, css_webkit, css_ms, css_epub — each a separate payload slot (blog.txt batch 0 slot 394: css_epub(fn_131652); batch 4 slot 255: css_webkit(fn_47969); batch 10 slot 4: css_ms(fn_28375); batch 12 slot 309: css_moz(fn_36218)). Mechanism in the decompiled VM (1.txt func_02995b): `tmp1015 = r5.createElement("invalidTag"); tmp1019 = globalThis.Object.keys(_502.style);` with fallback `r7.keys(Object.getPrototypeOf(_502.style))`, names bucketed by `new RegExp("^([A-Za-z][a-z]*)[A-Z]")` and counted per prefix in func_029a3a (`r4[r6] = r10 + 1`); probes read the counts back, e.g. func_031706 `r4 = r5.epub`.

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 css-engine-surface belongs to.