Skip to content

Commit 0308afc

Browse files
authored
Transform text/uri-list mime values in data transfers (microsoft#165768)
* Take different approach for transforming * Remove unused param
1 parent aa37e17 commit 0308afc

File tree

7 files changed

+77
-32
lines changed

7 files changed

+77
-32
lines changed

src/vs/base/common/dataTransfer.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { distinct } from 'vs/base/common/arrays';
67
import { URI } from 'vs/base/common/uri';
78
import { generateUuid } from 'vs/base/common/uuid';
89

@@ -92,3 +93,17 @@ export class VSDataTransfer {
9293
return mimeType.toLowerCase();
9394
}
9495
}
96+
97+
98+
export const UriList = Object.freeze({
99+
// http://amundsen.com/hypermedia/urilist/
100+
create: (entries: ReadonlyArray<string | URI>): string => {
101+
return distinct(entries.map(x => x.toString())).join('\r\n');
102+
},
103+
split: (str: string): string[] => {
104+
return str.split('\r\n');
105+
},
106+
parse: (str: string): string[] => {
107+
return UriList.split(str).filter(value => !value.startsWith('#'));
108+
}
109+
});

src/vs/editor/browser/dnd.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { DataTransfers } from 'vs/base/browser/dnd';
7-
import { distinct } from 'vs/base/common/arrays';
8-
import { createFileDataTransferItem, createStringDataTransferItem, IDataTransferItem, VSDataTransfer } from 'vs/base/common/dataTransfer';
7+
import { createFileDataTransferItem, createStringDataTransferItem, IDataTransferItem, UriList, VSDataTransfer } from 'vs/base/common/dataTransfer';
98
import { Mimes } from 'vs/base/common/mime';
109
import { URI } from 'vs/base/common/uri';
1110
import { CodeDataTransfers, extractEditorsDropData, FileAdditionalNativeProperties } from 'vs/platform/dnd/browser/dnd';
@@ -64,13 +63,3 @@ export function addExternalEditorsDropData(dataTransfer: VSDataTransfer, dragEve
6463
dataTransfer.delete(internal);
6564
}
6665
}
67-
68-
export const UriList = Object.freeze({
69-
// http://amundsen.com/hypermedia/urilist/
70-
create: (entries: ReadonlyArray<string | URI>): string => {
71-
return distinct(entries.map(x => x.toString())).join('\r\n');
72-
},
73-
parse: (str: string): string[] => {
74-
return str.split('\r\n').filter(value => !value.startsWith('#'));
75-
}
76-
});

src/vs/editor/contrib/copyPaste/browser/copyPasteController.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { DataTransfers } from 'vs/base/browser/dnd';
77
import { addDisposableListener } from 'vs/base/browser/dom';
88
import { CancelablePromise, createCancelablePromise, raceCancellation } from 'vs/base/common/async';
99
import { CancellationToken } from 'vs/base/common/cancellation';
10-
import { createStringDataTransferItem, VSDataTransfer } from 'vs/base/common/dataTransfer';
10+
import { createStringDataTransferItem, UriList, VSDataTransfer } from 'vs/base/common/dataTransfer';
1111
import { Disposable } from 'vs/base/common/lifecycle';
1212
import { Mimes } from 'vs/base/common/mime';
1313
import { generateUuid } from 'vs/base/common/uuid';
14-
import { toVSDataTransfer, UriList } from 'vs/editor/browser/dnd';
14+
import { toVSDataTransfer } from 'vs/editor/browser/dnd';
1515
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1616
import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService';
1717
import { EditorOption } from 'vs/editor/common/config/editorOptions';

src/vs/editor/contrib/dropIntoEditor/browser/dropIntoEditorContribution.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
import { raceCancellation } from 'vs/base/common/async';
77
import { CancellationToken } from 'vs/base/common/cancellation';
8-
import { VSDataTransfer } from 'vs/base/common/dataTransfer';
8+
import { UriList, VSDataTransfer } from 'vs/base/common/dataTransfer';
99
import { Disposable } from 'vs/base/common/lifecycle';
1010
import { Mimes } from 'vs/base/common/mime';
1111
import { relativePath } from 'vs/base/common/resources';
1212
import { URI } from 'vs/base/common/uri';
13-
import { addExternalEditorsDropData, toVSDataTransfer, UriList } from 'vs/editor/browser/dnd';
13+
import { addExternalEditorsDropData, toVSDataTransfer } from 'vs/editor/browser/dnd';
1414
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1515
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
1616
import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService';

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,7 @@ export interface DataTransferItemDTO {
13921392
readonly id: string;
13931393
readonly asString: string;
13941394
readonly fileData: IDataTransferFileDTO | undefined;
1395+
readonly uriListData?: ReadonlyArray<string | UriComponents>;
13951396
}
13961397

13971398
export interface DataTransferDTO {

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55

66
import { asArray, coalesce, isNonEmptyArray } from 'vs/base/common/arrays';
77
import { encodeBase64, VSBuffer } from 'vs/base/common/buffer';
8+
import { IDataTransferItem, UriList, VSDataTransfer } from 'vs/base/common/dataTransfer';
9+
import { once } from 'vs/base/common/functional';
810
import * as htmlContent from 'vs/base/common/htmlContent';
911
import { DisposableStore } from 'vs/base/common/lifecycle';
1012
import { ResourceSet } from 'vs/base/common/map';
1113
import { marked } from 'vs/base/common/marked/marked';
1214
import { parse } from 'vs/base/common/marshalling';
15+
import { Mimes } from 'vs/base/common/mime';
1316
import { cloneAndChange } from 'vs/base/common/objects';
1417
import { isEmptyObject, isNumber, isString, isUndefinedOrNull, withNullAsUndefined } from 'vs/base/common/types';
1518
import { URI, UriComponents } from 'vs/base/common/uri';
@@ -19,8 +22,8 @@ import { IPosition } from 'vs/editor/common/core/position';
1922
import * as editorRange from 'vs/editor/common/core/range';
2023
import { ISelection } from 'vs/editor/common/core/selection';
2124
import { IContentDecorationRenderOptions, IDecorationOptions, IDecorationRenderOptions, IThemeDecorationRenderOptions } from 'vs/editor/common/editorCommon';
22-
import * as languages from 'vs/editor/common/languages';
2325
import * as encodedTokenAttributes from 'vs/editor/common/encodedTokenAttributes';
26+
import * as languages from 'vs/editor/common/languages';
2427
import * as languageSelector from 'vs/editor/common/languageSelector';
2528
import { EndOfLineSequence, TrackedRangeStickiness } from 'vs/editor/common/model';
2629
import { ITextEditorOptions } from 'vs/platform/editor/common/editor';
@@ -39,8 +42,6 @@ import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGro
3942
import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
4043
import type * as vscode from 'vscode';
4144
import * as types from './extHostTypes';
42-
import { once } from 'vs/base/common/functional';
43-
import { IDataTransferItem, VSDataTransfer } from 'vs/base/common/dataTransfer';
4445

4546
export namespace Command {
4647

@@ -1966,7 +1967,7 @@ export namespace ViewBadge {
19661967
}
19671968

19681969
export namespace DataTransferItem {
1969-
export function toDataTransferItem(item: extHostProtocol.DataTransferItemDTO, resolveFileData: () => Promise<Uint8Array>): types.DataTransferItem {
1970+
export function to(mime: string, item: extHostProtocol.DataTransferItemDTO, resolveFileData: () => Promise<Uint8Array>): types.DataTransferItem {
19701971
const file = item.fileData;
19711972
if (file) {
19721973
return new class extends types.DataTransferItem {
@@ -1978,16 +1979,62 @@ export namespace DataTransferItem {
19781979
};
19791980
}
19801981
}('', item.id);
1981-
} else {
1982-
return new types.DataTransferItem(item.asString);
19831982
}
1983+
1984+
if (mime === Mimes.uriList && item.uriListData) {
1985+
return new types.DataTransferItem(reviveUriList(item.uriListData));
1986+
}
1987+
1988+
return new types.DataTransferItem(item.asString);
1989+
}
1990+
1991+
export async function from(mime: string, item: vscode.DataTransferItem | IDataTransferItem): Promise<extHostProtocol.DataTransferItemDTO> {
1992+
const stringValue = await item.asString();
1993+
1994+
if (mime === Mimes.uriList) {
1995+
return {
1996+
id: (item as IDataTransferItem | types.DataTransferItem).id,
1997+
asString: '',
1998+
fileData: undefined,
1999+
uriListData: serializeUriList(stringValue),
2000+
};
2001+
}
2002+
2003+
const fileValue = item.asFile();
2004+
return {
2005+
id: (item as IDataTransferItem | types.DataTransferItem).id,
2006+
asString: stringValue,
2007+
fileData: fileValue ? { name: fileValue.name, uri: fileValue.uri } : undefined,
2008+
};
2009+
}
2010+
2011+
function serializeUriList(stringValue: string): ReadonlyArray<string | URI> {
2012+
return UriList.split(stringValue).map(part => {
2013+
if (part.startsWith('#')) {
2014+
return part;
2015+
}
2016+
2017+
try {
2018+
return URI.parse(part);
2019+
} catch {
2020+
// noop
2021+
}
2022+
2023+
return part;
2024+
});
2025+
}
2026+
2027+
function reviveUriList(parts: ReadonlyArray<string | UriComponents>): string {
2028+
return UriList.create(parts.map(part => {
2029+
return typeof part === 'string' ? part : URI.revive(part);
2030+
}));
19842031
}
19852032
}
19862033

19872034
export namespace DataTransfer {
19882035
export function toDataTransfer(value: extHostProtocol.DataTransferDTO, resolveFileData: (itemId: string) => Promise<Uint8Array>): types.DataTransfer {
19892036
const init = value.items.map(([type, item]) => {
1990-
return [type, DataTransferItem.toDataTransferItem(item, () => resolveFileData(item.id))] as const;
2037+
return [type, DataTransferItem.to(type, item, () => resolveFileData(item.id))] as const;
19912038
});
19922039
return new types.DataTransfer(init);
19932040
}
@@ -1999,13 +2046,7 @@ export namespace DataTransfer {
19992046

20002047
value.forEach((value, key) => {
20012048
promises.push((async () => {
2002-
const stringValue = await value.asString();
2003-
const fileValue = value.asFile();
2004-
newDTO.items.push([key, {
2005-
id: (value as IDataTransferItem | types.DataTransferItem).id,
2006-
asString: stringValue,
2007-
fileData: fileValue ? { name: fileValue.name, uri: fileValue.uri } : undefined,
2008-
}]);
2049+
newDTO.items.push([key, await DataTransferItem.from(key, value)]);
20092050
})());
20102051
});
20112052

src/vs/workbench/browser/dnd.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { IListDragAndDrop } from 'vs/base/browser/ui/list/list';
1010
import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView';
1111
import { ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree';
1212
import { coalesce } from 'vs/base/common/arrays';
13-
import { VSDataTransfer } from 'vs/base/common/dataTransfer';
13+
import { UriList, VSDataTransfer } from 'vs/base/common/dataTransfer';
1414
import { Emitter } from 'vs/base/common/event';
1515
import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
1616
import { stringify } from 'vs/base/common/marshalling';
@@ -19,7 +19,6 @@ import { FileAccess, Schemas } from 'vs/base/common/network';
1919
import { isWindows } from 'vs/base/common/platform';
2020
import { basename, isEqual } from 'vs/base/common/resources';
2121
import { URI } from 'vs/base/common/uri';
22-
import { UriList } from 'vs/editor/browser/dnd';
2322
import { CodeDataTransfers, createDraggedEditorInputFromRawResourcesData, Extensions, extractEditorsAndFilesDropData, IDragAndDropContributionRegistry, IDraggedResourceEditorInput, IResourceStat } from 'vs/platform/dnd/browser/dnd';
2423
import { IFileService } from 'vs/platform/files/common/files';
2524
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';

0 commit comments

Comments
 (0)