https://browserleaks.com/rects

Element.getClientRects (̿▀̿ ̿Ĺ̯̿̿▀̿ ̿)̄
                                                            F i n g e r p r i n t i n g ?
test
line height

TorZillaPrint

return to TZP index
[ re-run ]
  loose
prototype lies 1
known lies
prototype lies code provided by CreepJS 1
[ re-run ]
[ i ]range 500-2560
  [css min-device-] screen resolution 1
[matchMedia] screen resolution 2
screen resolution
available resolution
outer window
inner window
[ i ] range 500-2560
  [css min-] inner window 1, 3
[matchMedia] inner window 2
viewport 4
[css | matchMedia] display-mode |
full screen
[ i ] full-screen-api.enabled
  [api] full screen
[ click here ]
[ i ] DON'T PANIC as you briefly
enter and then exit full screen
  [test] full screen 4
[ click here ]
[ i ] will attempt to open a new
window as big as possible
and grab the dimensions
  new window
[android] new window
[ i ] FF83+
dom.indexedDB.privateBrowsing.enabled
  private window
[screen] orientation | mozOrientation | angle
[css] -moz- | orientation | aspect-ratio | device-aspect-ratio | | |
[matchMedia] -moz- | orientation | aspect-ratio | device-aspect-ratio
[screen] pixel depth | color depth
[css | matchMedia] color |
dpi
[css min-resolution] dpi
[matchMedia max-resolution] dpi | dppx | dpcm
zoom %
devicePixelRatio
[matchMedia -webkit- | -moz-] device-pixel-ratio |
--- android ---
keyboard height
toolbar height
code based on work by Arthur Edelstein 1 , kkapsner & CanvasBlocker 2 , Matt Traudt 3 and earthlng 4
[ re-run ]
hash
userAgent
appCodeName
appName
product
appVersion
oscpu
platform
buildID
productSub
vendor
vendorSub
absolute BS detected ▶
--- other methods ---
iframes 1
workers
[ click here ] window.open
iframes 1
[contentWindow] document root
[contentWindow] with URL
[window] document root
[window] with URL
window access
iframe access
nested
workers
web worker
shared worker
service worker
nested worker
worker from blob
iframe code based on work by kkapsner & CreepJS 1
These tests, tailored for Firefox, are to show that you cannot hide your browser, version or OS. Some OS "guesses" don't have to be "correct"; the measurements provide the real entropy, such as math hashes, branding dimensions, and pixel values. Each test is independent of the others.
[ re-run ]
[css] branding
[css] browser
[collation] browser
[error messages] browser
[resource://] browser
[math] browser
[PoC]  
[ i ] Firefox 60+ only
  [feature detection] version
[chrome://] os
[math] os
[ i ]Linux, Mac or Windows
if none show = Android
if all show = fonts are blocked
  [css] os 1
Linux Mac Windows
[css line-height] os
[viewport scrollbar width] os 2, 3
[element scrollbar width] os
[widgets] os
error messages
hash
error1
error2
error3
error4
error5
math
hash
1st edition
polyfills: 6th edition
widgets
hash
[ i ] button, checkbox
color, combobox
datetime-local
radio, text
  various
datetime
textarea
code based on work by Arthur Edelstein 1 , Dr. Neal Krawetz 2 and earthlng 3
[ re-run ]
hash
language & locale
timezone
date/time & format
geolocation
language & locale
languages | language | languages[0]
[ i ] Collator
DateTimeFormat
DisplayNames
ListFormat
NumberFormat
PluralRules
RelativeTimeFormat
  resolvedOptions
timezone
timezoneOffset | getTime | Date.parse
[PoC]   [timezone offsets] Date.parse
[resolvedOptions] timezone
date/time & format
date/time
toString
[long] toLocaleString
[long] toLocaleDateString
[long] toLocaleTimeString
[long] Intl.DateTimeFormat
[formatToParts] Intl.DateTimeFormat
toGMTString
toUTCString
toLocaleString
[Typed Array] toLocaleString
toLocaleDateString
Intl.DateTimeFormat
[relatedYear | yearName] Intl.DateTimeFormat
[dateStyle | timeStyle] Intl.DateTimeFormat
toLocaleTimeString
toTimeString
[resolvedOptions] hourCycle
Intl.ListFormat
[dayPeriod] Intl.DateTimeFormat
[formatRange] Intl.DateTimeFormat
Intl.PluralRules
Intl.RelativeTimeFormat
[formatToParts] Intl.RelativeTimeFormat
Intl.NumberFormat
[formatToParts] Intl.NumberFormat
[BigInt] Intl.NumberFormat
[BigInt] toLocaleString
[currency] toLocaleString
[Intl.DateTimeFormat] calendar
[DateTime | RelativeTime] numberingSystem |
geolocation
[ i ] geo.enabled
  [api | window] geolocation
[ i ] permissions.default.geo
  [permission] geolocation
[ re-run ]
navigator
http headers
navigator
[ i ] beacon.enabled
  beacon
doNotTrack
globalPrivacyControl
[ i ] dom.netinfo.enabled
  [api] network information
connection
onLine
http headers
http_accept
http_accept_encoding
http_accept_language
http_dnt
http_upgrade_insecure_requests
http_user_agent
server_protocol
The [cookie], [localStorage], [sessionStorage] and [indexedDB] tests, on each run, individually attempt to set a new random name and value, and then to read them back. Only when it successfully reads back a matching value is it deemed to be available and working.
[ re-run ]
[navigator] cookieEnabled
[javascript 1st party cookie] session | persistent |
localStorage | test |
sessionStorage | test |
indexedDB | test |
[ i ] browser.cache.offline.enable
  appCache
worker
web worker | shared worker |
[ i ] dom.serviceWorkers.enabled
  service worker | test
|
[ i ] dom.caches.enabled
  service worker cache | test
|
notifications | test |
[permission] notifications | push | persistent-storage | |
[ i ] dom.storageManager.enabled
  storage manager
[ click here ] [properties | test] storage manager |
[ re-run ]
[ i ] dom.gamepad.enabled
  gamepads
[ i ] dom.maxHardwareConcurrency
  hardwareConcurrency
[api] pointer event
[css | matchMedia] any-hover | hover | |
[css | matchMedia] any-pointer | pointer | |
[ i ] media.webspeech.recognition.enable
  speech recognition
[ i ] maxTouchPoints
-moz-touch-enabled
ontouchstart
ontouchend
TouchEvent
  touch
[ i ] dom.vr.enabled
  virtual reality
--- enumeration ---
plugins
mimeTypes
[ i ] media.navigator.enabled & media.peerconnection.enabled
  media devices
[ i ] media.webspeech.synth.enabled
  speech engines
plugins
mimeTypes
media devices
speech engines
[ re-run ]
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 based on work by kkapsner & CanvasBlocker
Additonal canvas tests [iframes, workers, offscreen] can be found at CanvasBlocker
[ re-run ]
getContext
toDataURL
toBlob
mozGetAsFile
getImageData
winding
isPointInPath
isPointInStroke
fillText
strokeText
canvas code based on work by kkapsner & CanvasBlocker
[ re-run ]
hash
getContext
vendor | unmasked
renderer | unmasked
[webgl] parameters
[webgl2] parameters
--- render ---
readPixels
[webgl] image
[webgl2] image
webgl code based on work by kkapsner & CanvasBlocker
[ re-run ]
[ i ]dom.webaudio.enabled
  [api] web audio
getChannelData 1
copyFromChannel 1
sum 1
------
[ click here ] hash
audioContext 2
OscillatorNode 2
OscillatorNode/DynamicsCompressor 2
audioContext 2
OscillatorNode 2
OscillatorNode/DynamicsCompressor 2
audio code based on work by kkapsner & CanvasBlocker 1 and openWPM 2
The font enumeration tests are Firefox only and OS based to get metrics on stable fonts per OS. The font fallback test is a slower method that may produce different results. Additional font enumeration tests can be found at CreepJS
[ re-run ]
default proportional font
default font sizes
[ i ] layout.css.font-loading-api.enabled
  css font loading api
[ i ] browser.display.use_document_fonts
  document fonts
fonts 1, 2
[ click here ] font fallback 3
[offset] unicode glyphs 4
[domrect] unicode glyphs 4
[getClientRects] unicode glyphs 4
[textmetrics] unicode glyphs 4
[ i ] gfx.downloadable_fonts.woff2.enabled
Firefox 68 or lower
  WOFF2
offset 1
client 2
scroll 2
pixel 2
size 2
perspective 2
transform 2
fonts [ copy to clipboard ]
[ copy to clipboard ]
textMetrics
width
actualBoundingBoxAscent
actualBoundingBoxDescent
actualBoundingBoxLeft
actualBoundingBoxRight
alphabeticBaseline
emHeightAscent
emHeightDescent
fontBoundingBoxAscent
fontBoundingBoxDescent
hangingBaseline
ideographicBaseline
[offset] unicode glyphs [ copy to clipboard ]
code based on work by fingerprintjs2 1 , CreepJS 2 , Arthur Edelstein 3 and David Fifield & Serge Egelman 4
[ re-run ]
[ i ]media.media-capabilities.enabled
  mediaCapabilities
[ i ]dom.media.mediasession.enabled
  [api] mediaSession
[canPlayType] audio
[isTypeSupported] audio
[canPlayType] video
[isTypeSupported] video
audio
video
[ re-run ]
[-moz-] colors
[system] colors
[CSS4 system] colors
[system] fonts
computed styles 1
[ i ]ui.prefersReducedMotion
  [css | matchMedia] prefers-reduced-motion
|
[ i ]ui.systemUsesDarkTheme
  [css | matchMedia] prefers-color-scheme
|
[css | matchMedia] prefers-contrast |
[css | matchMedia] forced-colors |
CSS4 system colors
system fonts
code provided by CreepJS 1
testresult
testresult
testresult
[ re-run ]
[ i ] mathml.disabled
  mathml
[test example] mathml
[getEntries*] performance.mark
performance.now
[loadEventEnd] performance.timing
PerformanceNavigationTiming
[ i ] dom.reporting.enabled
  [api] reporting
stack depth
[ i ] svg.disabled
  svg
[ i ] javascript.options.wasm
  webassembly
window.content
------
[ i ] dom.use_components_shim
  component interfaces
iframe.contentWindow properties 1
navigator properties
component
navigator
code provided by CreepJS 1
section perf
tor browser detection points