mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 08:04:45 +00:00
Sandbox host services (per-session correctness + leaks): - NappletHostService/NappletBrowserService: guard broker-reply delivery against a stale tab (drop replies whose session was replaced) and wrap postMessage in runCatching so a torn-down WebView can't crash the relay; tear down each tab's content server + WebView on session close and in onDestroy; refuse to build an orphan WebView for an unknown session. - NappletContentServer.close(): shut the OkHttp dispatcher + evict the pool off the hot path so a closed tab doesn't leak connections/threads. - NappletBlobHttp: bound a blob fetch end-to-end with a callTimeout so a stalled Tor exit can't pin the WebView worker thread indefinitely. - UiAdapter close(): hop to the main thread before destroying the WebView. Embedded IME (shim.js + RemoteImeView): - Surrogate-pair-safe diff so an edited astral char (emoji, CJK-supplement) is never split into a lone surrogate in the synthesized InputEvent data. - Real contenteditable support: map char offsets through Ranges and replace in place instead of overwriting textContent (which destroyed structure + caret). - Dedup selectionchange against the last applied selection so our own setSel doesn't echo back to the host as a fresh edit. - RemoteImeView flushes synchronously at the outermost batch close, preserving the composing region across a compose+commit in the same frame. Embedded layer + preloader: - Resize the cross-process surface to the snapped imeAnimationTarget instead of the animated ime inset, so it doesn't reconfigure every keyboard-slide frame. - yield() between favorites in the startup sweep so building WebViews doesn't monopolize the frame. - Per-site Tor/open-web registries expose awaitReady(); the preloader awaits hydration before its first routing decision so a cold start can't route a site the user pinned to the open web through Tor. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MgMpRcWj6y82LxLiwcuzmN