Drop OSC 52 clipboard writes, force-kill on close, bound the reader, find the ST libs for tests

- OSC 52 is ignored: any output, cat'd or remote, could plant a command
  on the clipboard to paste
- kill(): terminate(force=True), so a child ignoring HUP and INT does
  not outlive its tab with the pty open
- reader pauses once 64 unparsed reads wait, so a large dump blocks the
  child at the pty instead of being buffered whole in memory
- tests/_bootstrap.py: add every Lib/python3* directory; Package Control
  puts the libraries under the active plugin host's own directory
This commit is contained in:
Vaclav Tvrdik
2026-10-25 10:40:25 +01:00
parent e478f41f7c
commit a556dab638
6 changed files with 28 additions and 32 deletions

View File

@@ -3,14 +3,16 @@
They run as plain scripts (see README), so each imports this first to get the
sublime stubs and the Package Control libraries on the path.
"""
import glob
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ST_LIB = os.path.expanduser(
"~/Library/Application Support/Sublime Text/Lib/python38")
# Package Control puts the libraries under the plugin host's own directory
ST_LIBS = sorted(glob.glob(os.path.expanduser(
"~/Library/Application Support/Sublime Text/Lib/python3*")))
for path in (ROOT, ST_LIB, os.path.join(ROOT, "tests", "stubs")):
for path in [ROOT] + ST_LIBS + [os.path.join(ROOT, "tests", "stubs")]:
if path not in sys.path:
sys.path.insert(0, path)

View File

@@ -83,13 +83,11 @@ def run_case(char_by_char):
assert proc.written == "\x1b]11;rgb:1a1a/2b2b/3c3c\x1b\\", (tag, proc.written)
assert screen.buffer[0][0].data == "y", tag
# OSC 52 clipboard (base64 "hi")
got = []
proc = FakeProcess()
screen = VtScreen(80, 24, process=proc, clipboard_callback=got.append)
stream = VtStream(screen)
feed(stream, "\x1b]52;c;aGk=\x07", char_by_char)
assert got == ["hi"], (tag, got)
# OSC 52 (clipboard write) is dropped, not drawn: untrusted output must
# not plant a paste
proc, screen, stream = make()
feed(stream, "\x1b]52;c;aGk=\x07z", char_by_char)
assert screen.buffer[0][0].data == "z" and proc.written == "", tag
# bracketed paste and sync modes tracked
proc, screen, stream = make()