Skip to content

Commit 9133118

Browse files
committed
fix(browser): accept no-preference in openclaw browser set media
The /set/media control route accepts dark|light|no-preference|none, but the CLI rejected no-preference, so prefers-color-scheme: no-preference could not be emulated from the CLI. Align the CLI argument, validation, and error text with the route contract and update the browser-control docs media line.
1 parent 3cf0d00 commit 9133118

3 files changed

Lines changed: 11 additions & 5 deletions

File tree

docs/tools/browser-control.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ These are useful for "make the site behave like X" workflows:
400400
- Headers: `set headers --headers-json '{"X-Debug":"1"}'` (or the positional form `set headers '{"X-Debug":"1"}'`)
401401
- HTTP basic auth: `set credentials user pass` (or `--clear`)
402402
- Geolocation: `set geo <lat> <lon> --origin "https://example.com"` (or `--clear`)
403-
- Media: `set media dark|light|none` (the underlying `/set/media` route also accepts `no-preference`)
403+
- Media: `set media dark|light|no-preference|none`
404404
- Timezone / locale: `set timezone ...`, `set locale ...`
405405
- Device / viewport:
406406
- `set device "iPhone 14"` (Playwright device presets)

extensions/browser/src/cli/browser-cli-state.option-collisions.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,16 @@ describe("browser state option collisions", () => {
177177
await runBrowserCommand(["set", "media", "sepia"]);
178178

179179
expect(mocks.callBrowserRequest).not.toHaveBeenCalled();
180-
expectErrorMessage("Expected dark|light|none");
180+
expectErrorMessage("Expected dark|light|no-preference|none");
181181
expect(getBrowserCliRuntime().exit).toHaveBeenCalledWith(1);
182182
});
183183

184+
it("passes no-preference through to /set/media", async () => {
185+
const request = await runBrowserCommandAndGetRequest(["set", "media", "no-preference"]);
186+
187+
expect(request.body).toMatchObject({ colorScheme: "no-preference" });
188+
});
189+
184190
it("rejects invalid geolocation numbers before dispatch", async () => {
185191
await runBrowserCommand(["set", "geo", "48.208", "16.373", "--accuracy", "fast"]);
186192

extensions/browser/src/cli/browser-cli-state.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,15 +257,15 @@ export function registerBrowserStateCommands(
257257
set
258258
.command("media")
259259
.description("Emulate prefers-color-scheme")
260-
.argument("<dark|light|none>", "dark/light/none")
260+
.argument("<dark|light|no-preference|none>", "dark/light/no-preference/none")
261261
.option("--target-id <id>", BROWSER_TAB_REFERENCE_HELP)
262262
.action(async (value: string, opts, cmd) => {
263263
const parent = parentOpts(cmd);
264264
const v = normalizeOptionalLowercaseString(value);
265265
const colorScheme =
266-
v === "dark" ? "dark" : v === "light" ? "light" : v === "none" ? "none" : null;
266+
v === "dark" || v === "light" || v === "no-preference" || v === "none" ? v : null;
267267
if (!colorScheme) {
268-
defaultRuntime.error(danger("Expected dark|light|none"));
268+
defaultRuntime.error(danger("Expected dark|light|no-preference|none"));
269269
defaultRuntime.exit(1);
270270
return;
271271
}

0 commit comments

Comments
 (0)