Files
Notes/tests/unit/focus-trap.test.js
2026-09-12 14:15:26 +08:00

57 lines
1.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// src/focus-trap.js 单测Phase O-L14 audit
//
// 覆盖:
// - IME 合成期间isComposing=true按 Tab 不抢焦点
// - keyCode=229Firefox / 旧 Chromium fallback按 Tab 不抢焦点
// - 普通 Tab 行为不变(首尾循环 / 容器内跳转)
/* @vitest-environment jsdom */
import { describe, it, expect, beforeEach } from 'vitest';
import { createFocusTrap } from '../../src/focus-trap.js';
let container;
let firstBtn;
let middleBtn;
let lastBtn;
beforeEach(() => {
document.body.innerHTML = '';
container = document.createElement('div');
container.tabIndex = -1;
firstBtn = document.createElement('button');
firstBtn.textContent = 'first';
middleBtn = document.createElement('button');
middleBtn.textContent = 'middle';
lastBtn = document.createElement('button');
lastBtn.textContent = 'last';
container.appendChild(firstBtn);
container.appendChild(middleBtn);
container.appendChild(lastBtn);
document.body.appendChild(container);
});
function fireKey(target, opts) {
const ev = new KeyboardEvent('keydown', { bubbles: true, cancelable: true, ...opts });
target.dispatchEvent(ev);
return ev;
}
describe('focus-trap IME 合成守门Phase O-L14', () => {
it('isComposing=true 时 Tab 不抢焦点preventDefault 不触发)', () => {
const trap = createFocusTrap(container);
// 模拟 IME 合成期间按 Tab
const ev = fireKey(middleBtn, { key: 'Tab', isComposing: true });
// IME 期间不拦 Tab让浏览器处理候选词
expect(ev.defaultPrevented).toBe(false);
trap.dispose();
});
it('keyCode=229Firefox / 旧 Chromium fallback时 Tab 不抢焦点', () => {
const trap = createFocusTrap(container);
const ev = fireKey(middleBtn, { key: 'Tab', keyCode: 229 });
expect(ev.defaultPrevented).toBe(false);
trap.dispose();
});
});