55
66import { asArray , coalesce , isNonEmptyArray } from 'vs/base/common/arrays' ;
77import { 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' ;
810import * as htmlContent from 'vs/base/common/htmlContent' ;
911import { DisposableStore } from 'vs/base/common/lifecycle' ;
1012import { ResourceSet } from 'vs/base/common/map' ;
1113import { marked } from 'vs/base/common/marked/marked' ;
1214import { parse } from 'vs/base/common/marshalling' ;
15+ import { Mimes } from 'vs/base/common/mime' ;
1316import { cloneAndChange } from 'vs/base/common/objects' ;
1417import { isEmptyObject , isNumber , isString , isUndefinedOrNull , withNullAsUndefined } from 'vs/base/common/types' ;
1518import { URI , UriComponents } from 'vs/base/common/uri' ;
@@ -19,8 +22,8 @@ import { IPosition } from 'vs/editor/common/core/position';
1922import * as editorRange from 'vs/editor/common/core/range' ;
2023import { ISelection } from 'vs/editor/common/core/selection' ;
2124import { IContentDecorationRenderOptions , IDecorationOptions , IDecorationRenderOptions , IThemeDecorationRenderOptions } from 'vs/editor/common/editorCommon' ;
22- import * as languages from 'vs/editor/common/languages' ;
2325import * as encodedTokenAttributes from 'vs/editor/common/encodedTokenAttributes' ;
26+ import * as languages from 'vs/editor/common/languages' ;
2427import * as languageSelector from 'vs/editor/common/languageSelector' ;
2528import { EndOfLineSequence , TrackedRangeStickiness } from 'vs/editor/common/model' ;
2629import { ITextEditorOptions } from 'vs/platform/editor/common/editor' ;
@@ -39,8 +42,6 @@ import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGro
3942import { ACTIVE_GROUP , SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService' ;
4043import type * as vscode from 'vscode' ;
4144import * as types from './extHostTypes' ;
42- import { once } from 'vs/base/common/functional' ;
43- import { IDataTransferItem , VSDataTransfer } from 'vs/base/common/dataTransfer' ;
4445
4546export namespace Command {
4647
@@ -1966,7 +1967,7 @@ export namespace ViewBadge {
19661967}
19671968
19681969export 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
19872034export 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
0 commit comments