fix(desktop): tighten browser shortcut validation

This commit is contained in:
Mohamed Boudra
2026-07-10 14:39:39 +02:00
parent d93d6a268a
commit 958c743609
3 changed files with 55 additions and 6 deletions

View File

@@ -146,6 +146,20 @@ describe("parseBrowserShortcutInput", () => {
});
});
it("keeps browser identities exact", () => {
expect(
parseBrowserShortcutInput({
browserId: " browser-1 ",
key: "t",
code: "KeyT",
meta: false,
control: true,
shift: false,
alt: false,
}),
).toMatchObject({ browserId: " browser-1 " });
});
it.each([
{
name: "a missing browser identity",

View File

@@ -1,5 +1,9 @@
import { describe, expect, test } from "vitest";
import { classifyBrowserReservedShortcut, parseBrowserKeyboardPolicy } from "./policy.js";
import {
classifyBrowserReservedShortcut,
parseBrowserKeyboardPolicy,
parseBrowserShortcutInput,
} from "./policy.js";
describe("browser keyboard policy", () => {
test("classifies shell-owned browser shortcuts for the current platform modifier", () => {
@@ -71,4 +75,35 @@ describe("browser keyboard policy", () => {
});
expect(parseBrowserKeyboardPolicy({ prefixes: [{ code: "KeyB", control: true }] })).toBeNull();
});
test("rejects a false code fallback instead of treating it as absent", () => {
expect(
parseBrowserKeyboardPolicy({
prefixes: [
{
alt: false,
code: "KeyB",
codeFallback: false,
control: true,
meta: false,
shift: false,
},
],
}),
).toBeNull();
});
test("keeps browser identities exact", () => {
expect(
parseBrowserShortcutInput({
alt: false,
browserId: " browser-1 ",
code: "KeyB",
control: true,
key: "b",
meta: false,
shift: false,
}),
).toMatchObject({ browserId: " browser-1 " });
});
});

View File

@@ -1,7 +1,7 @@
export interface BrowserShortcutPrefix {
alt: boolean;
code: string;
codeFallback?: boolean;
codeFallback?: true;
control: boolean;
key?: string;
meta: boolean;
@@ -44,7 +44,7 @@ function parsePrefix(value: unknown): BrowserShortcutPrefix | null {
typeof value.shift !== "boolean" ||
(value.key !== undefined && typeof value.key !== "string") ||
(value.shiftedKey !== undefined && typeof value.shiftedKey !== "string") ||
(value.codeFallback !== undefined && typeof value.codeFallback !== "boolean") ||
(value.codeFallback !== undefined && value.codeFallback !== true) ||
(value.repeat !== undefined && value.repeat !== false)
) {
return null;
@@ -52,7 +52,7 @@ function parsePrefix(value: unknown): BrowserShortcutPrefix | null {
return {
alt: value.alt,
code: value.code,
...(typeof value.codeFallback === "boolean" ? { codeFallback: value.codeFallback } : {}),
...(value.codeFallback === true ? { codeFallback: true } : {}),
control: value.control,
...(typeof value.key === "string" ? { key: value.key.toLowerCase() } : {}),
meta: value.meta,
@@ -83,7 +83,7 @@ export function parseBrowserShortcutInput(value: unknown): BrowserShortcutInput
}
if (
typeof value.browserId !== "string" ||
value.browserId.trim().length === 0 ||
value.browserId.length === 0 ||
typeof value.key !== "string" ||
typeof value.code !== "string" ||
typeof value.alt !== "boolean" ||
@@ -95,7 +95,7 @@ export function parseBrowserShortcutInput(value: unknown): BrowserShortcutInput
}
return {
alt: value.alt,
browserId: value.browserId.trim(),
browserId: value.browserId,
code: value.code,
control: value.control,
key: value.key,