fix(files): let context panel open binaries into FilesView safely

Skip UTF-8 pre-read for known binary/image/PDF paths so the shared
editor can show preview or cannot-preview instead of failing open or
decoding binaries as text.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-07-30 07:05:34 +00:00
co-authored by Serhii Dziupin
parent d79908cc9e
commit 4f30a00814
2 changed files with 54 additions and 1 deletions
@@ -0,0 +1,36 @@
import { describe, expect, test } from 'bun:test';
import type { FilesAPI } from '@/lib/api/types';
import { validateContextFileOpen } from './contextFileOpenGuard';
const filesApi = (content: string): FilesAPI => ({
listDirectory: async () => ({ path: '/', entries: [] }),
readFile: async () => ({ content, path: '/x' }),
});
describe('validateContextFileOpen', () => {
test('allows known binaries through without reading text', async () => {
const files: FilesAPI = {
listDirectory: async () => ({ path: '/', entries: [] }),
readFile: async () => {
throw new Error('should not read binary as text');
},
};
await expect(validateContextFileOpen(files, '/repo/docs/report.pdf')).resolves.toEqual({ ok: true });
await expect(validateContextFileOpen(files, '/repo/docs/report.docx')).resolves.toEqual({ ok: true });
await expect(validateContextFileOpen(files, '/repo/docs/pixel.png')).resolves.toEqual({ ok: true });
await expect(validateContextFileOpen(files, '/repo/bin/archive.zip')).resolves.toEqual({ ok: true });
});
test('rejects text payloads that look binary', async () => {
await expect(validateContextFileOpen(filesApi('%PDF-1.7\nbinary'), '/repo/mystery.bin.bak')).resolves.toEqual({
ok: false,
reason: 'binary',
});
});
test('allows ordinary text files', async () => {
await expect(validateContextFileOpen(filesApi('hello\nworld\n'), '/repo/notes.txt')).resolves.toEqual({ ok: true });
});
});