Files
camoufox/settings/properties.json
T
Jake WriterandClaude Opus 5.5 fb21b2e35a fix: stock animations and speech by default; drop config keys that freeze live values
Three behaviours a page could detect, changed in one breaking release:

- **Animations run on stock timing.** no-css-animations.patch finished every
  finite animation at once by default, and any page could read it:
  `el.animate(frames, 1000).effect.getComputedTiming().duration` was 0, and a
  500ms transition reported 0. Measured on v152.0.4-beta.31. The speedup is
  now an opt-in, `instantAnimations: True`, which raises a LeakWarning.
  disableInstantAnimations is gone.
- **speak() on a spoofed voice works like a real voice.** It fired `error`
  after 3ms unless voices:fakeCompletion was set, and then start and end in
  the same tick. It now starts and ends after the text's duration at ~150
  words per minute. Both voices:fakeCompletion keys are gone, and so is a
  debug line printed to stderr on every call.
- **Keys removed:**
  - battery:* and window.scrollMinX/Y: Firefox keeps getBattery() and
    scrollMin* chrome-only, so no page could read them.
  - window.scrollMaxX/Y, screen.pageXOffset/pageYOffset,
    window.history.length and document.body.client*: each pinned a live value
    to a constant, so scrolling, navigating or re-laying out never changed it.
    fpgen.yml mapped pageYOffset, so about 15% of identities froze
    window.scrollY at a non-zero value.
  - The body keys' role as an undocumented alias for window.innerWidth/Height
    in browser-init and in the launcher.
  - MaskConfig::GetInt32Rect, which only the body keys used.

New guards, both of which fail on v152.0.4-beta.31:
tests/patches/animation-timing.py and tests/patches/spoofed-voice-speaks.py.
The decisions are recorded as animations-run-on-stock-timing and
spoofed-voices-speak. Every patch applies cleanly to a fresh tree, and the
result builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:33:21 -06:00

86 lines
4.6 KiB
JSON

[
{ "property": "navigator.userAgent", "type": "str" },
{ "property": "navigator.doNotTrack", "type": "str" },
{ "property": "navigator.appVersion", "type": "str" },
{ "property": "navigator.oscpu", "type": "str" },
{ "property": "navigator.language", "type": "str" },
{ "property": "navigator.platform", "type": "str" },
{ "property": "navigator.hardwareConcurrency", "type": "uint" },
{ "property": "navigator.maxTouchPoints", "type": "uint" },
{ "property": "navigator.globalPrivacyControl", "type": "bool" },
{ "property": "navigator.buildID", "type": "str" },
{ "property": "screen.availHeight", "type": "uint" },
{ "property": "screen.availWidth", "type": "uint" },
{ "property": "screen.availTop", "type": "uint" },
{ "property": "screen.availLeft", "type": "uint" },
{ "property": "screen.height", "type": "uint" },
{ "property": "screen.width", "type": "uint" },
{ "property": "screen.colorDepth", "type": "uint" },
{ "property": "screen.pixelDepth", "type": "uint" },
{ "property": "window.outerHeight", "type": "uint" },
{ "property": "window.outerWidth", "type": "uint" },
{ "property": "window.innerHeight", "type": "uint" },
{ "property": "window.innerWidth", "type": "uint" },
{ "property": "window.screenX", "type": "int" },
{ "property": "window.screenY", "type": "int" },
{ "property": "window.devicePixelRatio", "type": "double" },
{ "property": "headers.User-Agent", "type": "str" },
{ "property": "headers.Accept-Language", "type": "str" },
{ "property": "headers.Accept-Encoding", "type": "str" },
{ "property": "webrtc:ipv4", "type": "str" },
{ "property": "webrtc:ipv6", "type": "str" },
{ "property": "fonts", "type": "array" },
{ "property": "audio:seed", "type": "uint" },
{ "property": "geolocation:latitude", "type": "double" },
{ "property": "geolocation:longitude", "type": "double" },
{ "property": "geolocation:accuracy", "type": "double" },
{ "property": "timezone", "type": "str" },
{ "property": "locale:language", "type": "str" },
{ "property": "locale:region", "type": "str" },
{ "property": "locale:script", "type": "str" },
{ "property": "locale:all", "type": "str" },
{ "property": "humanize", "type": "bool" },
{ "property": "humanize:maxTime", "type": "double" },
{ "property": "humanize:minTime", "type": "double" },
{ "property": "showcursor", "type": "bool" },
{ "property": "AudioContext:sampleRate", "type": "uint" },
{ "property": "AudioContext:outputLatency", "type": "double" },
{ "property": "AudioContext:maxChannelCount", "type": "uint" },
{ "property": "webGl:renderer", "type": "str" },
{ "property": "webGl:vendor", "type": "str" },
{ "property": "webGl:supportedExtensions", "type": "array" },
{ "property": "webGl2:supportedExtensions", "type": "array" },
{ "property": "webGl:parameters", "type": "dict" },
{ "property": "webGl2:parameters", "type": "dict" },
{ "property": "webGl:shaderPrecisionFormats", "type": "dict" },
{ "property": "webGl:shaderPrecisionFormats:blockIfNotDefined", "type": "bool" },
{ "property": "webGl2:shaderPrecisionFormats", "type": "dict" },
{ "property": "webGl2:shaderPrecisionFormats:blockIfNotDefined", "type": "bool" },
{ "property": "webGl:contextAttributes", "type": "dict" },
{ "property": "webGl2:contextAttributes", "type": "dict" },
{ "property": "voices", "type": "array" },
{ "property": "voices:blockIfNotDefined", "type": "bool" },
{ "property": "mediaDevices:micros", "type": "uint" },
{ "property": "mediaDevices:webcams", "type": "uint" },
{ "property": "mediaDevices:speakers", "type": "uint" },
{ "property": "mediaDevices:enabled", "type": "bool" },
{ "property": "mediaDevices:microphoneLabels", "type": "array" },
{ "property": "mediaDevices:microphoneGroups", "type": "array" },
{ "property": "mediaDevices:webcamLabels", "type": "array" },
{ "property": "mediaDevices:webcamGroups", "type": "array" },
{ "property": "mediaDevices:speakerLabels", "type": "array" },
{ "property": "mediaDevices:speakerGroups", "type": "array" },
{ "property": "media:spoof_codecs", "type": "bool" },
{ "property": "allowMainWorld", "type": "bool" },
{ "property": "disableWorldIsolation", "type": "bool" },
{ "property": "allowAddonNewtab", "type": "bool" },
{ "property": "forceScopeAccess", "type": "bool" },
{ "property": "disableTheming", "type": "bool" },
{ "property": "instantAnimations", "type": "bool" },
{ "property": "addons", "type": "array" },
{ "property": "certificatePaths", "type": "array" },
{ "property": "certificates", "type": "array" },
{ "property": "debug", "type": "bool" }
]