Files
camoufox/tests
Jake WriterandClaude Opus 5 e459dc5e1e fix(patches): express the no-search-engines stub in search-config v2 shape
SearchService.#init() threw on every launch, on a clean profile, in beta.28
through beta.30: "missing field `recordType` at line 1 column 114". The browser
ended up with no search service at all, which also takes out the urlbar's
heuristic result. Reported as daijro/camoufox#737.

The issue blames a stale bundled search-config-overrides-v2 dump. It is not
that. The reporter retracted that diagnosis after measuring, and both bundled
dumps are fine as shipped -- the overrides dump is never even parsed, because
setSearchConfig throws on the line before setConfigOverrides is reached.

The failing document is this patch's own stub. It returned a search-config *v1*
record (appliesTo/webExtension), but the selector is the Rust
SearchEngineSelector, which deserializes v2:

    #[serde(tag = "recordType", rename_all = "camelCase")]
    enum JSONSearchConfigurationRecords { ... }

recordType is that enum's tag, so a record lacking it aborts the whole
document. Note the #[serde(other)] Unknown variant: an unrecognised recordType
is tolerated, a missing one is fatal. Serialising the old stub gives exactly
116 characters with '}' at column 114 -- precisely where serde reports the
missing field, confirming the stub is the document that fails.

Return v2 records instead: one engine, plus defaultEngines and engineOrders.
An empty configuration is not an option, since getEngineConfiguration() rejects
[] with "Failed to get engine data from Remote Settings" and SearchSettings
refuses to write without an engine. So the "no search engines" stance is kept
by making the single engine inert, with a loopback search URL that cannot leave
the machine even if something does submit a search. Required fields were
checked against configuration_types.rs in this tree rather than assumed.

Verified on linux x86_64: 0 recordType errors, "Completed #init",
search.json.mozlz4 written, and the only engine present is the inert "None"
that settings/distribution/policies.json already defines as the default.

tests/patches/search-service-init.py guards it. This shipped broken through
three releases because the failure is a console error on a browser that
otherwise starts fine, so the test asserts the observable consequences --
settings written to disk, and the engine list -- rather than only the absence
of the error string. It fails on stock beta.30 and passes here.

The issue's further claim that this also empties the urlbar drop-down
(history, autofill) is untested here; the reporter flagged it as an inference.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2RfR387Mh1JhZ9LZvkptP
2026-09-05 17:30:33 -06:00
..
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00
2024-11-03 06:14:39 -06:00

Camoufox Tests

Ensures that Playwright functionality is not broken.


This directory is based on the original Playwright-Python tests.

It has been modified to skip tests that use the following features:

  • Injecting JavaScript into the page or writing to DOM. Camoufox's page.evaluate only supports reading values, not executing within the page context.
  • Overriding the User-Agent.
  • Any tests specific to Chromium or Webkit.

Usage

Setting up the environment

Cd to this directory and run the following command to setup the venv and install the dependencies:

bash setup-venv.sh

Running the tests

Run via the shell script:

bash run-tests.sh --headful --executable-path /path/to/camoufox-bin

Or through the Makefile:

make tests headful=true