mirror of
https://github.com/daijro/camoufox.git
synced 2026-10-05 08:00:21 +00:00
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>
86 lines
4.6 KiB
JSON
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" }
|
|
]
|