mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
The streamed page's keydown handler forwarded Ctrl/Cmd+V to the host as a keypress and cancelled the browser's paste event, so the host pasted its own (usually empty) clipboard. Native paste chords now fall through, and the frame's paste event inserts the clipboard text with browser.keyboardInsertText on the pane's input queue, split into chunks that fit the runtime socket frame. Co-authored-by: Chris Stephens <nyldn@users.noreply.github.com>
34 lines
1.0 KiB
TypeScript
34 lines
1.0 KiB
TypeScript
import { measureClipboardTextByteLength } from './clipboard-text'
|
|
import { getUtf8ChunkEndIndex } from './utf8-byte-limits'
|
|
|
|
export const BROWSER_TEXT_INSERT_CHUNK_BYTES = 64 * 1024
|
|
|
|
export function splitBrowserTextInsertionChunks(
|
|
text: string,
|
|
maxChunkBytes = BROWSER_TEXT_INSERT_CHUNK_BYTES
|
|
): string[] {
|
|
return [...iterateBrowserTextInsertionChunks(text, maxChunkBytes)]
|
|
}
|
|
|
|
export function* iterateBrowserTextInsertionChunks(
|
|
text: string,
|
|
maxChunkBytes = BROWSER_TEXT_INSERT_CHUNK_BYTES
|
|
): Generator<string> {
|
|
if (text.length === 0) {
|
|
return
|
|
}
|
|
const normalizedMax = Number.isFinite(maxChunkBytes) && maxChunkBytes > 0 ? maxChunkBytes : 1
|
|
const measurement = measureClipboardTextByteLength(text, { stopAfterBytes: normalizedMax })
|
|
if (!measurement.exceededLimit) {
|
|
yield text
|
|
return
|
|
}
|
|
|
|
let startIndex = 0
|
|
while (startIndex < text.length) {
|
|
const endIndex = getUtf8ChunkEndIndex(text, startIndex, normalizedMax)
|
|
yield text.slice(startIndex, endIndex)
|
|
startIndex = endIndex
|
|
}
|
|
}
|