fix(desktop, web): pont presse-papier Electron, sans quoi copier ne faisait rien dans l'app
CI / No em/en dashes (push) Successful in 3s
CI / Build & test (Node 24) (push) Successful in 10m48s
Release / Publish to Gitea npm registry (push) Successful in 10m52s
CI / Build & test (Node 22) (push) Successful in 11m6s
Desktop Release / Build Linux (AppImage + deb) (push) Successful in 13m38s
Desktop Release / Publish floating desktop-latest release (push) Successful in 11s
CI / Pack & boot smoke (Node 22) (push) Successful in 9m56s
Desktop Release / Build Windows (NSIS + portable) (push) Canceled after 0s

git-arboretum 3.5.1, desktop 0.2.2.

Le copier/coller livre en 3.5.0 ne fonctionnait que dans un navigateur : verifie dans l'app packagee,
`navigator.clipboard` y rejette en NotAllowedError A LA LECTURE COMME A L'ECRITURE. La copie echouait
donc silencieusement dans le contexte meme ou le probleme avait ete signale.

- feat(desktop): `arboretumDesktop.clipboard` expose par le preload, relaye en IPC vers le module
  `clipboard` d'Electron (lecture + ecriture, ecriture bornee a 1 M de caracteres). Le module
  `clipboard` n'etant pas accessible a un preload sandboxe, le passage par le main est obligatoire.
  Constantes de canaux isolees dans src/shared/ipc.ts pour que le bundle du preload ne tire pas
  `ipcMain` avec lui.
- fix(web): acces au presse-papier en cascade, du plus fiable au plus degrade : pont de l'app de
  bureau, puis `navigator.clipboard`, puis `document.execCommand('copy')` pour l'ecriture. Ce dernier
  recours couvre aussi l'acces LAN en clair (http://<ip>:7317), ou l'API Clipboard est indisponible.
- test: quatre cas de plus sur l'ordre de la cascade et le retour a null quand tout est refuse
  (501 tests). Pont IPC verifie dans un vrai Electron : writeText/readText repondent OK, alors que
  `navigator.clipboard` y refuse. Le chemin complet frappe -> copie -> collage -> SIGINT reste
  couvert par verify-clipboard.mjs (Chromium CDP, ALL GREEN).
This commit is contained in:
2026-08-04 21:11:46 +02:00
parent bde5358ea8
commit 114fbc8ba0
13 changed files with 197 additions and 23 deletions
+4 -13
View File
@@ -27,7 +27,7 @@ import '@xterm/xterm/css/xterm.css';
import { wsClient, type Attachment } from '../lib/ws-client';
import { terminalTheme, TERMINAL_FONT_FAMILY } from '../lib/terminal-theme';
import { resolvedTheme } from '../lib/theme';
import { clipboardIntent, isMacPlatform } from '../lib/terminal-clipboard';
import { clipboardIntent, isMacPlatform, readClipboard, writeClipboard } from '../lib/terminal-clipboard';
const props = withDefaults(defineProps<{ sessionId: string; mode?: 'interactive' | 'observer' }>(), {
mode: 'interactive',
@@ -155,20 +155,11 @@ onMounted(async () => {
// est invisible au DOM, on y injecte donc nous-mêmes le texte sélectionné.
const copySelection = async (): Promise<void> => {
const text = activeTerm.getSelection();
if (!text) return;
try {
await navigator.clipboard.writeText(text);
} catch {
/* presse-papier refusé (contexte non sécurisé) : le menu Édition natif reste disponible */
}
if (text) await writeClipboard(text);
};
const pasteClipboard = async (): Promise<void> => {
try {
const text = await navigator.clipboard.readText();
if (text) attachment?.sendStdin(text);
} catch {
/* lecture refusée : xterm reçoit de toute façon les collages natifs via son textarea */
}
const text = await readClipboard();
if (text) attachment?.sendStdin(text);
};
activeTerm.attachCustomKeyEventHandler((e) => {
if (e.type !== 'keydown') return true;