Masked WebGL VENDOR matches the engine
Masked VENDOR reads "WebKit" whenever the UA claims Chrome or AppleWebKit.
What a detector infers
This check reads the plain gl.getParameter(gl.VENDOR) — the masked value, not the debug extension's unmasked GPU string. That constant does not describe the GPU at all; it labels the engine that built the GL context. Chromium reports "WebKit" and Gecko reports "Mozilla", so a Gecko-based browser presenting a Chrome user-agent still answers "Mozilla" here unless it separately rewrote this specific constant.
The check only runs when the UA claims Chrome or AppleWebKit (otherwise N/A, as is a missing WebGL context), and then simply asserts the vendor matches /WebKit/i. The inference is direct: the claimed engine and the engine that actually created the context contradict each other, and the engine cannot be wrong about itself.
How to resolve it
Present a user-agent that describes the engine actually running. If a Chrome identity is required, run a Chromium-based browser; a Gecko engine behind a Chrome UA contradicts itself here and at several other engine-level constants, and papering over each one individually does not scale.
Nearby checks in Render & GPU
- The anisotropy limit reads as a number once its WebGL extension is enabled
webgl-anisotropy-after-extensionEXT_texture_filter_anisotropic adds exactly one parameter to getParameter, MAX_TEXTURE_MAX_ANISOTROPY_EXT, and the extension guarantees it… - A Direct3D 11 WebGL renderer reports the uniform limits ANGLE fixes for its vendor
webgl-d3d11-limits-vs-vendorChrome, Edge, Brave and Firefox on Windows render WebGL through ANGLE's Direct3D 11 backend, and that backend does not ask the driver for… - A Mesa OpenGL WebGL renderer reports the varying and uniform limits Mesa and ANGLE give it
webgl-mesa-limits-vs-driverChrome on Linux renders WebGL through ANGLE's OpenGL backend, which does not invent shader limits: it reads MAX_VARYING_VECTORS from the GL… - WebGL vendor/renderer identical in a Worker
webgl-worker-vs-mainThe audit reads UNMASKED_VENDOR and UNMASKED_RENDERER on the main thread, then spawns a dedicated Worker that builds its own WebGL context… - WebGL1 and WebGL2 report the same UNMASKED GPU
webgl1-webgl2-coherenceThe check creates a WebGL1 context and a WebGL2 context and reads UNMASKED_VENDOR_WEBGL / UNMASKED_RENDERER_WEBGL from each through the… - Canvas readback is not noise-injected (1×1 probe)
canvas-tamperThe probe fills a single pixel with pure black on a 1x1 canvas and reads it straight back with getImageData. - One flat fill reads back as exactly one colour
canvas-flat-fill-uniformThis is the area form of the 1×1 canvas probe, and it exists because that probe is easy to pass by accident. - One pixel reads the same through a full read and a windowed read
canvas-subrect-consistencyThe same pixels, asked for twice through different windows. A full-canvas read and an inner 16×16 read overlap on 256 pixels, and those are…
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 Render & GPU 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 Render & GPU — the family webgl-engine-vendor belongs to.
