TorZillaPrint

TZP is only designed for Firefox [v60+] and the Tor Browser [v8+]. Here are additonal tests, and here is the repo [feel free to drop in]. When re-testing sections, be aware that some pref/option changes may require a page refresh [F5] or even a new browser session.

screen resolution
[ i ] real time update when spoofing
inner window: range 500-2560
  [css] screen resolution 1
available resolution
outer window
inner window
[ i ] real time update:
range 500-2560
  [css] inner window 1, 2
viewport 3
full screen
[ i ] full-screen-api.enabled
  [api] full screen
[ i ] DON'T PANIC as you briefly
enter and then exit full screen
  [test] full screen 3
[ i ] will attempt to open a new
window as big as possible
and grab the dimensions
  new window
private window
orientation
[matchMedia] window orientation
[inner width vs inner height] window orientation
pixel depth
color depth
dpi
[css] dpi
[matchMedia] dpi
zoom %
devicePixelRatio
[scrollY] devicePixelRatio 4
[clientRect] devicePixelRatio 4
code based on work by 1Arthur Edelstein , 2 Matt Traudt , 3 earthlng and 4 Alex Catarineu
Browser, version and os tests are to show how trivial it is to detect Firefox/Tor Browser, the version and your os. However, some have real entropy, such as math hashes or pixel values. Returning the browser/os here is just for fun. Each test is independent of the others.
[header] http_user_agent
[navigator] userAgent
[navigator] appCodeName
[navigator] appName
[navigator] product
[navigator] appVersion
[navigator] oscpu
[navigator] platform
[navigator] buildID
[navigator] productSub
---browser, version, os---
[css] browser
[error messages] browser
[ i ] mozPaintCount:
we could also use
mozGetAsFile
mozInnerScreenX
mozScreenX
oscpu
scrollMaxX
  [feature detection] browser
[resource://] browser
[math] browser
[ i ] Firefox 60+ only
  [feature detection] version
[chrome://] os
[math] os
[ i ] Linux, Mac or Windows
  [css] os 1
Linux Mac Windows
[ i ] based on [css] os above
  [font] os 1
[css line-height] os
[scrollbar width] os 2, 3
[tcp/ip] os
[widgets] os
error messages
hash
error1
error2
error3
error4
error5
error6
widgets
hash
button|checkbox|color|combobox|datetime-local|radio|text
datetime
textarea
code based on work by 1Arthur Edelstein , 2 Dr. Neal Krawetz and 3 earthlng
6th edition
1st edition
combined
ECMAScript 6th Edition
atanh(0.5)
expm1(1)
sinh(1)
ECMAScript 1st Edition
cos(1e251)
cos(1e140)
cos(1e12)
cos(1e130)
cos(1e272)
cos(1e0)
cos(1e284)
cos(1e75)
ECMAScript 6th edition math code courtesy of Fingerprint Central
[header] http_accept_language
[navigator] languages
[navigator] language
[navigator] languages[0]
[Intl.PluralRules] locale
[resolvedOptions] locale
[ i ] test if the error message
uses your application locale
  [test] DTD locale
timezone offsets
[resolvedOptions] timezone
system date/time
toString
[long] toLocaleString
[long] toLocaleDateString
[long] toLocaleTimeString
[long] Intl.DateTimeFormat
[formatToParts] Intl.DateTimeFormat
toGMTString
toUTCString
toLocaleString
[Typed Array] toLocaleString
toLocaleDateString
Intl.DateTimeFormat
toLocaleTimeString
toTimeString
[formatToParts] Intl.NumberFormat
[resolvedOptions] hourCycle
Intl.RelativeTimeFormat
[resolvedOptions] calendar
[resolvedOptions] numberingSystem
[ i ] geo.enabled
  [api] geolocation
[ i ] permissions.default.geo
  [permission] geolocation
DTD locale leaks courtesy of Alex Catarineu here and here
[navigator] doNotTrack
[ i ] dom.netinfo.enabled
  [api] network information
[navigator] connection
[navigator] onLine
------
http_accept
http_accept_encoding
http_dnt
http_upgrade_insecure_requests
server_protocol
The [cookie], [localStorage], [sessionStorage] and [indexedDB] tests, on each run, each use a new random name and value, attempt to set them, and then to read the value back. Only when it successfully reads back the value is it deemed to be available and working.
[navigator] cookieEnabled
[test] 1st party cookie
localStorage
[test] localStorage
sessionStorage
[test] sessionStorage
indexedDB
[test] indexedDB
[ i ] browser.cache.offline.enable
  appCache
[test] appCache
worker
[test] web worker
[test] shared worker
service worker
[test] service worker
service worker cache
[test] service worker cache
notifications
[test] notifications
[permission] notifications
[permission] push
storage manager
[properties] storage manager
[test] storage manager
[permission] persistent storage
[navigator] hardwareConcurrency
[ i ] dom.gamepad.enabled
  [api] gamepad
[ i ] media.navigator.enabled
  mediaDevices
enumerateDevices
[navigator] maxTouchPoints
[ i ] media.webspeech.synth.enabled
  speech synthesis
speech engines
[ i ] dom.vr.enabled
  [api] webvr
activeVRDisplays
getContext
toDataURL
toBlob
mozGetAsFile
getImageData
winding
isPointInPath
isPointInStroke
fillText
strokeText
[webgl] readPixels
canvas code courtesy of kkapsner and CanvasBlocker
Element.getClientRects
Element.getBoundingClientRect
Range.getClientRects
Range.getBoundingClientRect
click here to view what is being rendered
[ *browserleaks* ][ *getClientRects* ][ Fingerprinting? ][ select ][ progress bar ][ empty button ]
Element.getClientRects
[note: the other three methods have the same hash and values]
x
y
width
height
top
left
right
bottom
Element.getBoundingClientRect
x
y
width
height
top
left
right
bottom
Range.getClientRects
x
y
width
height
top
left
right
bottom
Range.getBoundingClientRect
x
y
width
height
top
left
right
bottom
domrect code courtesy of kkapsner and CanvasBlocker
The real world strikes a balance between efficiency vs entropy [fingerprintjs2 checks 64 fonts by default], but these tests are designed to be comprehensive, not small and fast. As such, they are not automatically run.
@font-face
document fonts
enumerate fonts 1
js 2
the other js 3
unicode glyphs 3
canvas
enumerate fonts  
code based on work by 1Arthur Edelstein , 2 fingerprintjs2 and 3 browserleaks
[ i ] dom.webaudio.enabled
  [api] web audio
getChannelData
copyFromChannel
sum
audio code courtesy of kkapsner and CanvasBlocker
[ i ] media.media-capabilities.enabled
  [navigator] mediaCapabilities
testresult
prefers-color-scheme
prefers-reduced-motion
system colors
testresult
testresult
testresult
[navigator] clipboard
[ i ] dom.IntersectionObserver.enabled
  [api] intersection observer
[ i ] mathml.disabled
  mathml
[test example] mathml x=b ±b24 ac 2a
[ i ] dom.requestIdleCallback.enabled
  requestIdleCallback