Skip to content

Commit 23433ab

Browse files
authored
DND from OS no longer works (fix microsoft#230536) (microsoft#230567)
1 parent 62d8aa2 commit 23433ab

File tree

9 files changed

+29
-51
lines changed

9 files changed

+29
-51
lines changed

src/vs/editor/browser/dnd.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { DataTransfers } from '../../base/browser/dnd.js';
77
import { createFileDataTransferItem, createStringDataTransferItem, IDataTransferItem, UriList, VSDataTransfer } from '../../base/common/dataTransfer.js';
88
import { Mimes } from '../../base/common/mime.js';
99
import { URI } from '../../base/common/uri.js';
10-
import { CodeDataTransfers, FileAdditionalNativeProperties } from '../../platform/dnd/browser/dnd.js';
10+
import { CodeDataTransfers, getPathForFile } from '../../platform/dnd/browser/dnd.js';
1111

1212

1313
export function toVSDataTransfer(dataTransfer: DataTransfer) {
@@ -28,7 +28,8 @@ export function toVSDataTransfer(dataTransfer: DataTransfer) {
2828
}
2929

3030
function createFileDataTransferItemFromFile(file: File): IDataTransferItem {
31-
const uri = (file as FileAdditionalNativeProperties).path ? URI.parse((file as FileAdditionalNativeProperties).path!) : undefined;
31+
const path = getPathForFile(file);
32+
const uri = path ? URI.parse(path!) : undefined;
3233
return createFileDataTransferItem(file.name, uri, async () => {
3334
return new Uint8Array(await file.arrayBuffer());
3435
});
@@ -55,7 +56,7 @@ export function toExternalVSDataTransfer(sourceDataTransfer: DataTransfer, overw
5556
for (const item of sourceDataTransfer.items) {
5657
const file = item.getAsFile();
5758
if (file) {
58-
const path = (file as FileAdditionalNativeProperties).path;
59+
const path = getPathForFile(file);
5960
try {
6061
if (path) {
6162
editorData.push(URI.file(path).toString());

src/vs/platform/dnd/browser/dnd.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { VSBuffer } from '../../../base/common/buffer.js';
1212
import { ResourceMap } from '../../../base/common/map.js';
1313
import { parse } from '../../../base/common/marshalling.js';
1414
import { Schemas } from '../../../base/common/network.js';
15-
import { isWeb } from '../../../base/common/platform.js';
15+
import { isNative, isWeb } from '../../../base/common/platform.js';
1616
import { URI } from '../../../base/common/uri.js';
1717
import { localize } from '../../../nls.js';
1818
import { IDialogService } from '../../dialogs/common/dialogs.js';
@@ -24,13 +24,6 @@ import { IInstantiationService, ServicesAccessor } from '../../instantiation/com
2424
import { extractSelection } from '../../opener/common/opener.js';
2525
import { Registry } from '../../registry/common/platform.js';
2626

27-
export interface FileAdditionalNativeProperties {
28-
/**
29-
* The real path to the file on the users filesystem. Only available on electron.
30-
*/
31-
readonly path?: string;
32-
}
33-
3427

3528
//#region Editor / Resources DND
3629

@@ -84,9 +77,9 @@ export function extractEditorsDropData(e: DragEvent): Array<IDraggedResourceEdit
8477
if (e.dataTransfer?.files) {
8578
for (let i = 0; i < e.dataTransfer.files.length; i++) {
8679
const file = e.dataTransfer.files[i];
87-
if (file && (file as FileAdditionalNativeProperties).path /* Electron only */) {
80+
if (file && getPathForFile(file)) {
8881
try {
89-
editors.push({ resource: URI.file((file as FileAdditionalNativeProperties).path!), isExternal: true, allowWorkspaceOpen: true });
82+
editors.push({ resource: URI.file(getPathForFile(file)!), isExternal: true, allowWorkspaceOpen: true });
9083
} catch (error) {
9184
// Invalid URI
9285
}
@@ -407,4 +400,16 @@ export class LocalSelectionTransfer<T> {
407400
}
408401
}
409402

403+
/**
404+
* A helper to get access to Electrons `webUtils.getPathForFile` function
405+
* in a safe way without crashing the application when running in the web.
406+
*/
407+
export function getPathForFile(file: File): string | undefined {
408+
if (isNative && typeof (globalThis as any).vscode?.webUtils?.getPathForFile === 'function') {
409+
return (globalThis as any).vscode.webUtils.getPathForFile(file);
410+
}
411+
412+
return undefined;
413+
}
414+
410415
//#endregion

src/vs/workbench/contrib/files/browser/fileActions.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { KeyChord, KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
6060
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
6161
import { ILocalizedString } from '../../../../platform/action/common/action.js';
6262
import { VSBuffer } from '../../../../base/common/buffer.js';
63+
import { getPathForFile } from '../../../../platform/dnd/browser/dnd.js';
6364

6465
export const NEW_FILE_COMMAND_ID = 'explorer.newFile';
6566
export const NEW_FILE_LABEL = nls.localize2('newFile', "New File...");
@@ -1128,7 +1129,7 @@ export const pasteFileHandler = async (accessor: ServicesAccessor, fileList?: Fi
11281129
}
11291130

11301131
if (toPaste.type === 'paths') {
1131-
const path = hostService.getPathForFile(item);
1132+
const path = getPathForFile(item);
11321133
if (path) {
11331134
return path;
11341135
}
@@ -1287,13 +1288,13 @@ type FilesToPaste =
12871288
async function getFilesToPaste(fileList: FileList | undefined, clipboardService: IClipboardService, hostService: IHostService): Promise<FilesToPaste> {
12881289
if (fileList && fileList.length > 0) {
12891290
// with a `fileList` we support natively pasting file from disk from clipboard
1290-
const resources = [...fileList].map(file => hostService.getPathForFile(file)).filter(filePath => !!filePath && isAbsolute(filePath)).map((filePath) => URI.file(filePath!));
1291+
const resources = [...fileList].map(file => getPathForFile(file)).filter(filePath => !!filePath && isAbsolute(filePath)).map((filePath) => URI.file(filePath!));
12911292
if (resources.length) {
12921293
return { type: 'paths', files: resources, };
12931294
}
12941295

12951296
// Support pasting files that we can't read from disk
1296-
return { type: 'data', files: [...fileList].filter(file => !hostService.getPathForFile(file)) };
1297+
return { type: 'data', files: [...fileList].filter(file => !getPathForFile(file)) };
12971298
} else {
12981299
// otherwise we fallback to reading resources from our clipboard service
12991300
return { type: 'paths', files: resources.distinctParents(await clipboardService.readResources(), resource => resource) };

src/vs/workbench/contrib/terminal/browser/terminalInstance.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { AccessibilitySignal, IAccessibilitySignalService } from '../../../../pl
3030
import { ICommandService } from '../../../../platform/commands/common/commands.js';
3131
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
3232
import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
33-
import { CodeDataTransfers, containsDragType } from '../../../../platform/dnd/browser/dnd.js';
33+
import { CodeDataTransfers, containsDragType, getPathForFile } from '../../../../platform/dnd/browser/dnd.js';
3434
import { FileSystemProviderCapabilities, IFileService } from '../../../../platform/files/common/files.js';
3535
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
3636
import { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';
@@ -84,7 +84,6 @@ import type { IMarker, Terminal as XTermTerminal } from '@xterm/xterm';
8484
import { AccessibilityCommandId } from '../../accessibility/common/accessibilityCommands.js';
8585
import { terminalStrings } from '../common/terminalStrings.js';
8686
import { TerminalIconPicker } from './terminalIconPicker.js';
87-
import { IHostService } from '../../../services/host/browser/host.js';
8887
import { TerminalResizeDebouncer } from './terminalResizeDebouncer.js';
8988
import { openContextMenu } from './terminalContextMenu.js';
9089
import type { IMenu } from '../../../../platform/actions/common/actions.js';
@@ -2312,7 +2311,6 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID
23122311
private readonly _container: HTMLElement,
23132312
@IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService,
23142313
@IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService,
2315-
@IHostService private readonly _hostService: IHostService,
23162314
) {
23172315
super();
23182316
this._register(toDisposable(() => this._clearDropOverlay()));
@@ -2395,9 +2393,9 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID
23952393
path = URI.file(JSON.parse(rawCodeFiles)[0]);
23962394
}
23972395

2398-
if (!path && e.dataTransfer.files.length > 0 && this._hostService.getPathForFile(e.dataTransfer.files[0])) {
2396+
if (!path && e.dataTransfer.files.length > 0 && getPathForFile(e.dataTransfer.files[0])) {
23992397
// Check if the file was dragged from the filesystem
2400-
path = URI.file(this._hostService.getPathForFile(e.dataTransfer.files[0])!);
2398+
path = URI.file(getPathForFile(e.dataTransfer.files[0])!);
24012399
}
24022400

24032401
if (!path) {

src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import { InputBox, MessageType } from '../../../../base/browser/ui/inputbox/inpu
3838
import { createSingleCallFunction } from '../../../../base/common/functional.js';
3939
import { IKeyboardEvent } from '../../../../base/browser/keyboardEvent.js';
4040
import { KeyCode } from '../../../../base/common/keyCodes.js';
41-
import { CodeDataTransfers, containsDragType } from '../../../../platform/dnd/browser/dnd.js';
41+
import { CodeDataTransfers, containsDragType, getPathForFile } from '../../../../platform/dnd/browser/dnd.js';
4242
import { terminalStrings } from '../common/terminalStrings.js';
4343
import { ILifecycleService } from '../../../services/lifecycle/common/lifecycle.js';
4444
import { IProcessDetails } from '../../../../platform/terminal/common/terminalProcess.js';
@@ -51,7 +51,6 @@ import { Schemas } from '../../../../base/common/network.js';
5151
import { getColorForSeverity } from './terminalStatusList.js';
5252
import { TerminalContextActionRunner } from './terminalContextMenu.js';
5353
import type { IHoverAction } from '../../../../base/browser/ui/hover/hover.js';
54-
import { IHostService } from '../../../services/host/browser/host.js';
5554
import { HoverPosition } from '../../../../base/browser/ui/hover/hoverWidget.js';
5655

5756
const $ = DOM.$;
@@ -587,7 +586,6 @@ class TerminalTabsDragAndDrop extends Disposable implements IListDragAndDrop<ITe
587586
constructor(
588587
@ITerminalService private readonly _terminalService: ITerminalService,
589588
@ITerminalGroupService private readonly _terminalGroupService: ITerminalGroupService,
590-
@IHostService private readonly _hostService: IHostService,
591589
@IListService private readonly _listService: IListService,
592590
) {
593591
super();
@@ -753,9 +751,9 @@ class TerminalTabsDragAndDrop extends Disposable implements IListDragAndDrop<ITe
753751
resource = URI.file(JSON.parse(rawCodeFiles)[0]);
754752
}
755753

756-
if (!resource && e.dataTransfer.files.length > 0 && this._hostService.getPathForFile(e.dataTransfer.files[0])) {
754+
if (!resource && e.dataTransfer.files.length > 0 && getPathForFile(e.dataTransfer.files[0])) {
757755
// Check if the file was dragged from the filesystem
758-
resource = URI.file(this._hostService.getPathForFile(e.dataTransfer.files[0])!);
756+
resource = URI.file(getPathForFile(e.dataTransfer.files[0])!);
759757
}
760758

761759
if (!resource) {

src/vs/workbench/services/host/browser/browserHostService.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -574,13 +574,6 @@ export class BrowserHostService extends Disposable implements IHostService {
574574

575575
//#endregion
576576

577-
//#region File
578-
579-
getPathForFile(): undefined {
580-
return undefined; // unsupported in browser environments
581-
}
582-
583-
//#endregion
584577
}
585578

586579
registerSingleton(IHostService, BrowserHostService, InstantiationType.Delayed);

src/vs/workbench/services/host/browser/host.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,4 @@ export interface IHostService {
122122

123123
//#endregion
124124

125-
//#region File
126-
127-
getPathForFile(file: File): string | undefined;
128-
129-
//#endregion
130125
}

src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { IMainProcessService } from '../../../../platform/ipc/common/mainProcess
1717
import { disposableWindowInterval, getActiveDocument, getWindowId, getWindowsCount, hasWindow, onDidRegisterWindow } from '../../../../base/browser/dom.js';
1818
import { memoize } from '../../../../base/common/decorators.js';
1919
import { isAuxiliaryWindow } from '../../../../base/browser/window.js';
20-
import { webUtils } from '../../../../base/parts/sandbox/electron-sandbox/globals.js';
2120

2221
class WorkbenchNativeHostService extends NativeHostService {
2322

@@ -187,14 +186,6 @@ class WorkbenchHostService extends Disposable implements IHostService {
187186

188187
//#endregion
189188

190-
//#region File
191-
192-
getPathForFile(file: File): string {
193-
return webUtils.getPathForFile(file);
194-
}
195-
196-
//#endregion
197-
198189
}
199190

200191
registerSingleton(IHostService, WorkbenchHostService, InstantiationType.Delayed);

src/vs/workbench/test/browser/workbenchTestServices.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,10 +1563,6 @@ export class TestHostService implements IHostService {
15631563

15641564
readonly colorScheme = ColorScheme.DARK;
15651565
onDidChangeColorScheme = Event.None;
1566-
1567-
getPathForFile(file: File): string | undefined {
1568-
return undefined;
1569-
}
15701566
}
15711567

15721568
export class TestFilesConfigurationService extends FilesConfigurationService {

0 commit comments

Comments
 (0)