Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
4b5ab0f
test(input): add multilingual browser assurance baseline
seonghobae Aug 20, 2026
109e5b7
test(input): cover structured multilingual edits and history
seonghobae Aug 20, 2026
7d01120
test(input): add narrow viewport multilingual assurance
seonghobae Aug 20, 2026
f144163
test(input): make structured caret placement engine-neutral
seonghobae Aug 20, 2026
e6b5c65
test(input): exercise touch-capable multilingual focus
seonghobae Aug 20, 2026
448b55c
test(input): preserve text across emulated viewport changes
seonghobae Aug 20, 2026
c56ce12
test(input): prove emulated touch pointer delivery
seonghobae Aug 21, 2026
0ec1bd0
test(input): require read-only committed-input isolation
seonghobae Aug 21, 2026
d6c2592
test(input): expose read-only harness control
seonghobae Aug 21, 2026
c9ed56c
test(input): make network-negative control non-vacuous
seonghobae Aug 21, 2026
b4d9a3e
test(input): cover read-only transition during composition
seonghobae Aug 21, 2026
9887b06
test(input): exercise read-only composition through CwlEditor
seonghobae Aug 21, 2026
f67026a
test(input): wait for editor readiness before harness calls
seonghobae Aug 21, 2026
781becd
merge: stack input assurance on editor composition fix
seonghobae Aug 21, 2026
c9e9262
test(input): expose native form serialization
seonghobae Aug 22, 2026
4d8ee51
test(input): prove native form serialization after composition
seonghobae Aug 22, 2026
c15e361
test(input): require narrow touch toolbar targets
seonghobae Aug 23, 2026
22d4df3
test(input): expose toolbar in touch harness
seonghobae Aug 23, 2026
30690cf
test(input): bind composition editability to native form state
seonghobae Aug 23, 2026
61b23cb
chore(stack): merge latest standalone-editor parent into input assurance
seonghobae Aug 24, 2026
bcd789c
test(input): require clean remount after active composition
seonghobae Aug 24, 2026
ca7450b
test(input): support composition teardown remount assurance
seonghobae Aug 24, 2026
4719f83
test(browser): include all engine browser specs
seonghobae Aug 24, 2026
e807c52
test(input): enforce loopback-only native-form assurance
seonghobae Aug 24, 2026
a75254d
chore(stack): restack browser assurance on current parent
seonghobae Aug 25, 2026
bf3be65
test(input): strengthen narrow viewport touch evidence
seonghobae Aug 25, 2026
91a834b
Merge 580ac1ad7453d5f6c443b1cea52493bef822844e into bf3be655c177dab75…
seonghobae Aug 25, 2026
4a1ffa4
test(browser): load production styles in input harness
seonghobae Aug 25, 2026
b89b38e
test(browser): assert canonical form serialization after remount
seonghobae Aug 25, 2026
c994a25
chore(stack): integrate current #201 parent
seonghobae Aug 26, 2026
64954c8
chore(stack): integrate current #201 parent
seonghobae Aug 27, 2026
fccc446
chore(stack): integrate current #201 parent
seonghobae Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/browser/input-harness.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Inkspan input assurance harness</title>
</head>
<body>
<main>
<div id="editor"></div>
</main>
<script type="module" src="./input-harness.ts"></script>
</body>
</html>
75 changes: 75 additions & 0 deletions tests/browser/input-harness.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import type { Editor } from '@tiptap/core';
import { createElement } from 'react';
import { createRoot } from 'react-dom/client';
import { CwlEditor } from 'inkspan-browser-under-test';
import '../../src/styles.css';

declare global {
interface Window {
inkspanInputHarness: {
getHtml: () => string;
getText: () => string;
isComposing: () => boolean;
redo: () => boolean;
remount: () => boolean;
setEditable: (editable: boolean) => boolean;
setHtml: (html: string) => boolean;
undo: () => boolean;
};
}
}

const element = document.getElementById('editor');
if (!(element instanceof HTMLElement)) {
throw new Error('Input assurance harness editor host is missing.');
}

const showToolbar = new URLSearchParams(window.location.search).get('toolbar') === '1';
let editor: Editor | null = null;
let editable = true;
let root = createRoot(element);

const renderEditor = () => {
root.render(
createElement(CwlEditor, {
mode: 'html',
defaultValue: '',
editable,
hideToolbar: !showToolbar,
formFieldName: 'message_body',
onReady: (instance: Editor) => {
editor = instance;
},
}),
);
};

const getEditor = (): Editor => {
if (!editor) {
throw new Error('Input assurance harness editor is not ready.');
}
return editor;
};

renderEditor();

window.inkspanInputHarness = Object.freeze({
getHtml: () => getEditor().getHTML(),
getText: () => getEditor().getText(),
isComposing: () => getEditor().view.composing,
redo: () => getEditor().commands.redo(),
remount: () => {
root.unmount();
editor = null;
root = createRoot(element);
renderEditor();
return true;
},
setEditable: (nextEditable: boolean) => {
editable = nextEditable;
renderEditor();
return editable;
},
setHtml: (html: string) => getEditor().commands.setContent(html, false),
undo: () => getEditor().commands.undo(),
});
2 changes: 1 addition & 1 deletion tests/browser/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { defineConfig, devices } from '@playwright/test';

const HARNESS_ORIGIN = 'http://127.0.0.1:4173';
const HARNESS_URL = `${HARNESS_ORIGIN}/tests/browser/harness.html`;
const ENGINE_BROWSER_SPECS = /(?:clipboard|focus|print)\.browser\.spec\.ts/u;
const ENGINE_BROWSER_SPECS = /\.browser\.spec\.ts$/u;

export default defineConfig({
testDir: './specs',
Expand Down
Loading
Loading