fix(overlay): support native Wayland file drag-and-drop (#199)

This commit is contained in:
2026-08-15 00:15:38 -07:00
committed by GitHub
parent 7d729cb60c
commit 2174e689a2
6 changed files with 42 additions and 5 deletions
+24
View File
@@ -30,6 +30,16 @@ test('collectDroppedVideoPaths keeps supported dropped file paths in order', ()
assert.deepEqual(result, ['/videos/ep02.mkv', '/videos/ep03.MP4']);
});
test('collectDroppedVideoPaths accepts paths resolved from standard Web File objects', () => {
const transfer = makeTransfer({
files: [{ name: 'ep02.mkv' }, { name: 'notes.txt' }],
});
const result = collectDroppedVideoPaths(transfer, ['/videos/ep02.mkv', '/videos/notes.txt']);
assert.deepEqual(result, ['/videos/ep02.mkv']);
});
test('collectDroppedVideoPaths parses text/uri-list entries and de-duplicates', () => {
const transfer = makeTransfer({
getData: (format: string) =>
@@ -53,6 +63,20 @@ test('collectDroppedSubtitlePaths keeps supported dropped subtitle paths in orde
assert.deepEqual(result, ['/subs/ep02.ass', '/subs/ep03.SRT']);
});
test('collectDroppedSubtitlePaths accepts paths resolved from standard Web File objects', () => {
const transfer = makeTransfer({
files: [{ name: 'ep02.ass' }, { name: 'readme.txt' }, { name: 'ep03.SRT' }],
});
const result = collectDroppedSubtitlePaths(transfer, [
'/subs/ep02.ass',
'/subs/readme.txt',
'/subs/ep03.SRT',
]);
assert.deepEqual(result, ['/subs/ep02.ass', '/subs/ep03.SRT']);
});
test('collectDroppedSubtitlePaths parses text/uri-list entries and de-duplicates', () => {
const transfer = makeTransfer({
getData: (format: string) =>
+6 -2
View File
@@ -93,18 +93,21 @@ export function parseClipboardVideoPath(text: string): string | null {
export function collectDroppedVideoPaths(
dataTransfer: DropDataTransferLike | null | undefined,
resolvedFilePaths: ArrayLike<string> = [],
): string[] {
return collectDroppedPaths(dataTransfer, isSupportedVideoPath);
return collectDroppedPaths(dataTransfer, resolvedFilePaths, isSupportedVideoPath);
}
export function collectDroppedSubtitlePaths(
dataTransfer: DropDataTransferLike | null | undefined,
resolvedFilePaths: ArrayLike<string> = [],
): string[] {
return collectDroppedPaths(dataTransfer, isSupportedSubtitlePath);
return collectDroppedPaths(dataTransfer, resolvedFilePaths, isSupportedSubtitlePath);
}
function collectDroppedPaths(
dataTransfer: DropDataTransferLike | null | undefined,
resolvedFilePaths: ArrayLike<string>,
isSupportedPath: (pathValue: string) => boolean,
): string[] {
if (!dataTransfer) return [];
@@ -124,6 +127,7 @@ function collectDroppedPaths(
for (let i = 0; i < dataTransfer.files.length; i += 1) {
const file = dataTransfer.files[i] as { path?: string } | undefined;
addPath(file?.path);
addPath(resolvedFilePaths[i]);
}
}