Files
camoufox/settings/properties.json
T
Jake Writer 0169975638 fix(config): declare media:spoof_codecs, and guard the whole class
PR #562 added a `media:spoof_codecs` read on the C++ side --
MaskConfig::GetBool("media:spoof_codecs") in MP4Decoder and
MatroskaDecoder -- but never declared the key in settings/. Since
validate_config() drops any key it does not recognise, the documented
usage was inert:

    AsyncCamoufox(config={"media:spoof_codecs": True})
    -> "Skipping unknown patch media:spoof_codecs : True"

The key never reached the browser, so the feature could not be turned on
through the supported path at all. Declared in both properties.json and
camoucfg.jvv (bool, beside mediaDevices:enabled).

The new test is the general form rather than a check for this one key:
it scans patches/ and additions/ for MaskConfig::Get*/Has*("key") reads
and fails when a key is not declared in settings/properties.json. A
patch and its schema entry are two halves of one change, and shipping
only one half is a mistake this project has now made in both directions
-- canvas:seed (#721) and navigator.maxTouchPoints (#696) were declared
but unconsumed; this one was consumed but undeclared. Across the tree
the scan finds 63 reads against 109 declared keys, and media:spoof_codecs
was the only gap.

Note the runtime reads properties.json from the *installed browser
bundle*, not the repo, so this fix only takes effect for a build
packaged after it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GQgHHGRXNp29jr4xQjK7iv
(cherry picked from commit 375b0fca4529a722220022c7993c030b83439db1)
2026-09-05 14:26:37 -06:00

114 lines
6.1 KiB
JSON

[
{ "property": "navigator.userAgent", "type": "str" },
{ "property": "navigator.doNotTrack", "type": "str" },
{ "property": "navigator.appCodeName", "type": "str" },
{ "property": "navigator.appName", "type": "str" },
{ "property": "navigator.appVersion", "type": "str" },
{ "property": "navigator.oscpu", "type": "str" },
{ "property": "navigator.language", "type": "str" },
{ "property": "navigator.languages", "type": "array" },
{ "property": "navigator.platform", "type": "str" },
{ "property": "navigator.hardwareConcurrency", "type": "uint" },
{ "property": "navigator.product", "type": "str" },
{ "property": "navigator.productSub", "type": "str" },
{ "property": "navigator.maxTouchPoints", "type": "uint" },
{ "property": "navigator.cookieEnabled", "type": "bool" },
{ "property": "navigator.globalPrivacyControl", "type": "bool" },
{ "property": "navigator.buildID", "type": "str" },
{ "property": "navigator.onLine", "type": "bool" },
{ "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": "screen.pageXOffset", "type": "double" },
{ "property": "screen.pageYOffset", "type": "double" },
{ "property": "window.scrollMinX", "type": "int" },
{ "property": "window.scrollMinY", "type": "int" },
{ "property": "window.scrollMaxX", "type": "int" },
{ "property": "window.scrollMaxY", "type": "int" },
{ "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.history.length", "type": "uint" },
{ "property": "window.devicePixelRatio", "type": "double" },
{ "property": "document.body.clientWidth", "type": "uint" },
{ "property": "document.body.clientHeight", "type": "uint" },
{ "property": "document.body.clientTop", "type": "uint" },
{ "property": "document.body.clientLeft", "type": "uint" },
{ "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": "webrtc:localipv4", "type": "str" },
{ "property": "webrtc:localipv6", "type": "str" },
{ "property": "pdfViewerEnabled", "type": "bool" },
{ "property": "battery:charging", "type": "bool" },
{ "property": "battery:chargingTime", "type": "double" },
{ "property": "battery:dischargingTime", "type": "double" },
{ "property": "battery:level", "type": "double" },
{ "property": "fonts", "type": "array" },
{ "property": "fonts:spacing_seed", "type": "uint" },
{ "property": "audio:seed", "type": "uint" },
{ "property": "canvas: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": "webGl:parameters:blockIfNotDefined", "type": "bool" },
{ "property": "webGl2:parameters", "type": "dict" },
{ "property": "webGl2:parameters:blockIfNotDefined", "type": "bool" },
{ "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": "canvas:aaOffset", "type": "int" },
{ "property": "canvas:aaCapOffset", "type": "bool" },
{ "property": "voices", "type": "array" },
{ "property": "voices:blockIfNotDefined", "type": "bool" },
{ "property": "voices:fakeCompletion", "type": "bool" },
{ "property": "voices:fakeCompletion:charsPerSecond", "type": "double" },
{ "property": "mediaDevices:micros", "type": "uint" },
{ "property": "mediaDevices:webcams", "type": "uint" },
{ "property": "mediaDevices:speakers", "type": "uint" },
{ "property": "mediaDevices:enabled", "type": "bool" },
{ "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": "disableInstantAnimations", "type": "bool" },
{ "property": "memorysaver", "type": "bool" },
{ "property": "addons", "type": "array" },
{ "property": "certificatePaths", "type": "array" },
{ "property": "certificates", "type": "array" },
{ "property": "debug", "type": "bool" }
]