Skip to content

Commit 321423d

Browse files
authored
Standardize text/uri-list handling (microsoft#152756)
This creates a common set of functions for creating and parsing the `text/uri-list` mime type. As part of this, I also aligned us with the standard, which uses `\r\n` between lines instead of just `\n`
1 parent 09fa374 commit 321423d

File tree

5 files changed

+19
-15
lines changed

5 files changed

+19
-15
lines changed

extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export async function tryGetUriListSnippet(document: vscode.TextDocument, dataTr
4444
}
4545

4646
const uris: vscode.Uri[] = [];
47-
for (const resource of urlList.split('\n')) {
47+
for (const resource of urlList.split('\r\n')) {
4848
try {
4949
uris.push(vscode.Uri.parse(resource));
5050
} catch {

src/vs/editor/browser/dnd.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,21 @@ export function addExternalEditorsDropData(dataTransfer: VSDataTransfer, dragEve
5656
}
5757

5858
if (editorData.length) {
59-
const str = distinct(editorData).join('\n');
60-
dataTransfer.replace(Mimes.uriList, createStringDataTransferItem(str));
59+
dataTransfer.replace(Mimes.uriList, createStringDataTransferItem(UriList.create(editorData)));
6160
}
6261
}
6362

6463
for (const internal of INTERNAL_DND_MIME_TYPES) {
6564
dataTransfer.delete(internal);
6665
}
6766
}
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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { createStringDataTransferItem, VSDataTransfer } from 'vs/base/common/dat
1010
import { Disposable } from 'vs/base/common/lifecycle';
1111
import { Mimes } from 'vs/base/common/mime';
1212
import { generateUuid } from 'vs/base/common/uuid';
13-
import { toVSDataTransfer } from 'vs/editor/browser/dnd';
13+
import { toVSDataTransfer, UriList } from 'vs/editor/browser/dnd';
1414
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1515
import { IBulkEditService, ResourceEdit } from 'vs/editor/browser/services/bulkEditService';
1616
import { EditorOption } from 'vs/editor/common/config/editorOptions';
@@ -176,8 +176,7 @@ export class CopyPasteController extends Disposable implements IEditorContributi
176176
if (!dataTransfer.has(Mimes.uriList)) {
177177
const resources = await this._clipboardService.readResources();
178178
if (resources.length) {
179-
const value = resources.join('\n');
180-
dataTransfer.append(Mimes.uriList, createStringDataTransferItem(value));
179+
dataTransfer.append(Mimes.uriList, createStringDataTransferItem(UriList.create(resources)));
181180
}
182181
}
183182

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Disposable } from 'vs/base/common/lifecycle';
99
import { Mimes } from 'vs/base/common/mime';
1010
import { relativePath } from 'vs/base/common/resources';
1111
import { URI } from 'vs/base/common/uri';
12-
import { addExternalEditorsDropData, toVSDataTransfer } from 'vs/editor/browser/dnd';
12+
import { addExternalEditorsDropData, toVSDataTransfer, UriList } from 'vs/editor/browser/dnd';
1313
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1414
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
1515
import { IBulkEditService, ResourceEdit } from 'vs/editor/browser/services/bulkEditService';
@@ -137,9 +137,9 @@ class DefaultOnDropProvider implements DocumentOnDropEditProvider {
137137
return undefined;
138138
}
139139

140-
private getUriListInsertText(urlList: string): string | undefined {
140+
private getUriListInsertText(strUriList: string): string | undefined {
141141
const uris: URI[] = [];
142-
for (const resource of urlList.split('\n')) {
142+
for (const resource of UriList.parse(strUriList)) {
143143
try {
144144
uris.push(URI.parse(resource));
145145
} catch {

src/vs/workbench/browser/dnd.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ 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';
2223
import { CodeDataTransfers, createDraggedEditorInputFromRawResourcesData, Extensions, extractEditorsAndFilesDropData, IDragAndDropContributionRegistry, IDraggedResourceEditorInput, IResourceStat } from 'vs/platform/dnd/browser/dnd';
2324
import { IFileService } from 'vs/platform/files/common/files';
2425
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
@@ -60,7 +61,7 @@ export async function extractTreeDropData(dataTransfer: VSDataTransfer): Promise
6061
if (dataTransfer.has(resourcesKey)) {
6162
try {
6263
const asString = await dataTransfer.get(resourcesKey)?.asString();
63-
const rawResourcesData = JSON.stringify(asString?.split('\n').filter(value => !value.startsWith('#')));
64+
const rawResourcesData = JSON.stringify(UriList.parse(asString ?? ''));
6465
editors.push(...createDraggedEditorInputFromRawResourcesData(rawResourcesData));
6566
} catch (error) {
6667
// Invalid transfer
@@ -70,11 +71,6 @@ export async function extractTreeDropData(dataTransfer: VSDataTransfer): Promise
7071
return editors;
7172
}
7273

73-
export function convertResourceUrlsToUriList(resourceUrls: string): string {
74-
const asJson: URI[] = JSON.parse(resourceUrls);
75-
return asJson.map(uri => uri.toString()).join('\n');
76-
}
77-
7874
export interface IResourcesDropHandlerOptions {
7975

8076
/**

0 commit comments

Comments
 (0)