66import { coalesce , distinct } from 'vs/base/common/arrays' ;
77import * as glob from 'vs/base/common/glob' ;
88import { UnownedDisposable } from 'vs/base/common/lifecycle' ;
9- import { basename } from 'vs/base/common/resources' ;
9+ import { Schemas } from 'vs/base/common/network' ;
10+ import { basename , DataUri } from 'vs/base/common/resources' ;
1011import { withNullAsUndefined } from 'vs/base/common/types' ;
1112import { URI } from 'vs/base/common/uri' ;
1213import { generateUuid } from 'vs/base/common/uuid' ;
@@ -16,7 +17,7 @@ import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/ed
1617import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation' ;
1718import { IQuickInputService , IQuickPickItem } from 'vs/platform/quickinput/common/quickInput' ;
1819import { IWorkbenchContribution } from 'vs/workbench/common/contributions' ;
19- import { EditorOptions , IEditor , IEditorInput } from 'vs/workbench/common/editor' ;
20+ import { EditorInput , EditorOptions , IEditor , IEditorInput } from 'vs/workbench/common/editor' ;
2021import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput' ;
2122import { webviewEditorsExtensionPoint } from 'vs/workbench/contrib/customEditor/browser/extensionPoint' ;
2223import { CustomEditorDiscretion , CustomEditorInfo , CustomEditorSelector , ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor' ;
@@ -203,25 +204,33 @@ export class CustomEditorContribution implements IWorkbenchContribution {
203204 }
204205
205206 if ( editor instanceof DiffEditorInput ) {
206- if ( editor . modifiedInput instanceof CustomFileEditorInput ) {
207- return ;
208- }
209- const resource = editor . modifiedInput . getResource ( ) ;
210- if ( ! resource ) {
211- return ;
212- }
207+ const getCustomEditorOverrideForSubInput = ( subInput : IEditorInput ) : EditorInput | undefined => {
208+ if ( subInput instanceof CustomFileEditorInput ) {
209+ return undefined ;
210+ }
211+ const resource = subInput . getResource ( ) ;
212+ if ( ! resource ) {
213+ return undefined ;
214+ }
213215
214- const customEditors = distinct ( [
215- ...this . customEditorService . getUserConfiguredCustomEditors ( resource ) ,
216- ...this . customEditorService . getContributedCustomEditors ( resource ) ,
217- ] , editor => editor . id ) ;
216+ const editors = distinct ( [
217+ ...this . customEditorService . getUserConfiguredCustomEditors ( resource ) ,
218+ ...this . customEditorService . getContributedCustomEditors ( resource ) ,
219+ ] , editor => editor . id ) ;
218220
219- // Always prefer the first editor in the diff editor case
220- if ( customEditors . length > 0 ) {
221+ // Always prefer the first editor in the diff editor case
222+ return editors . length
223+ ? this . customEditorService . createInput ( resource , editors [ 0 ] . id , group )
224+ : undefined ;
225+ } ;
226+
227+ const modifiedOverride = getCustomEditorOverrideForSubInput ( editor . modifiedInput ) ;
228+ const originalOverride = getCustomEditorOverrideForSubInput ( editor . originalInput ) ;
229+
230+ if ( modifiedOverride || originalOverride ) {
221231 return {
222232 override : ( async ( ) => {
223- const newModified = this . customEditorService . createInput ( resource , customEditors [ 0 ] . id , group ) ;
224- const input = new DiffEditorInput ( editor . getName ( ) , editor . getDescription ( ) , editor . originalInput , newModified ) ;
233+ const input = new DiffEditorInput ( editor . getName ( ) , editor . getDescription ( ) , originalOverride || editor . originalInput , modifiedOverride || editor . modifiedInput ) ;
225234 return this . editorService . openEditor ( input , { ...options , ignoreOverrides : true } , group ) ;
226235 } ) ( ) ,
227236 } ;
@@ -285,6 +294,15 @@ export class CustomEditorContribution implements IWorkbenchContribution {
285294}
286295
287296function matches ( selector : CustomEditorSelector , resource : URI ) : boolean {
297+ if ( resource . scheme === Schemas . data ) {
298+ const metadata = DataUri . parseMetaData ( resource ) ;
299+ const mime = metadata . get ( DataUri . META_DATA_MIME ) ;
300+ if ( ! selector . mime || ! mime ) {
301+ return false ;
302+ }
303+ return glob . match ( selector . mime , mime . toLowerCase ( ) ) ;
304+ }
305+
288306 if ( ! selector . filenamePattern && ! selector . scheme ) {
289307 return false ;
290308 }
0 commit comments