diff --git a/extensions/vscode-api-tests/src/commands.test.ts b/extensions/vscode-api-tests/src/commands.test.ts index 5ffd6fd2ac7..495de2d1d96 100644 --- a/extensions/vscode-api-tests/src/commands.test.ts +++ b/extensions/vscode-api-tests/src/commands.test.ts @@ -40,23 +40,6 @@ suite('commands namespace tests', () => { }, done); }); - test('api-command: workbench.html.preview', function () { - - let registration = workspace.registerTextDocumentContentProvider('speciale', { - provideTextDocumentContent(uri) { - return `content of URI ${uri.toString()}`; - } - }); - - let virtualDocumentUri = Uri.parse('speciale://authority/path'); - - return commands.executeCommand('vscode.previewHtml', virtualDocumentUri).then(success => { - assert.ok(success); - registration.dispose(); - }); - - }); - test('editorCommand with extra args', function () { let args: IArguments; @@ -77,4 +60,46 @@ suite('commands namespace tests', () => { }); }); + + test('api-command: vscode.previewHtm', function () { + + let registration = workspace.registerTextDocumentContentProvider('speciale', { + provideTextDocumentContent(uri) { + return `content of URI ${uri.toString()}`; + } + }); + + let virtualDocumentUri = Uri.parse('speciale://authority/path'); + + return commands.executeCommand('vscode.previewHtml', virtualDocumentUri).then(success => { + assert.ok(success); + registration.dispose(); + }); + + }); + + test('api-command: vscode.diff', function () { + + let registration = workspace.registerTextDocumentContentProvider('sc', { + provideTextDocumentContent(uri) { + return `content of URI ${uri.toString()}#${Math.random()}`; + } + }); + + + let a = commands.executeCommand('vscode.diff', Uri.parse('sc:a'), Uri.parse('sc:b'), 'DIFF').then(value => { + assert.ok(value === void 0); + registration.dispose(); + }); + + let b = commands.executeCommand('vscode.diff', Uri.parse('sc:a'), Uri.parse('sc:b')).then(value => { + assert.ok(value === void 0); + registration.dispose(); + }); + + let c = commands.executeCommand('vscode.diff').then(() => assert.ok(false), () => assert.ok(true)); + let d = commands.executeCommand('vscode.diff', 1, 2, 3).then(() => assert.ok(false), () => assert.ok(true)); + + return Promise.all([a, b, c]); + }); }); diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 92c8a164e52..666c57b577e 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -197,6 +197,17 @@ class ExtHostApiCommands { { name: 'configuration', description: '(optional) Name of the debug configuration from \'launch.json\' to use. Or a configuration json object to use.' } ] }); + + this._register('vscode.diff', (left: URI, right: URI, label: string) => { + return this._commands.executeCommand('_workbench.diff', [left, right, label]); + }, { + description: 'Opens the provided resources in the diff editor to compare their contents.', + args: [ + { name: 'left', description: 'Left-hand side resource of the diff editor', constraint: URI }, + { name: 'right', description: 'Right-hand side resource of the diff editor', constraint: URI }, + { name: 'title', description: '(optional) Human readable title for the diff editor', constraint: v => v === void 0 || typeof v === 'string' } + ] + }); } // --- command impl diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 217820b5640..635937fcf9f 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -5,12 +5,15 @@ 'use strict'; +import URI from 'vs/base/common/uri'; import {TPromise} from 'vs/base/common/winjs.base'; import timer = require('vs/base/common/timer'); import paths = require('vs/base/common/paths'); import {Action} from 'vs/base/common/actions'; import {IWindowService} from 'vs/workbench/services/window/electron-browser/windowService'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; +import {EditorInput} from 'vs/workbench/common/editor'; +import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; import nls = require('vs/nls'); import {IMessageService, Severity} from 'vs/platform/message/common/message'; import {IWindowConfiguration} from 'vs/workbench/electron-browser/window'; @@ -459,4 +462,29 @@ KeybindingsRegistry.registerCommandDesc({ }, when: undefined, primary: undefined +}); + +KeybindingsRegistry.registerCommandDesc({ + id: '_workbench.diff', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), + handler(accessor: ServicesAccessor, args: [URI, URI, string]) { + + const editorService = accessor.get(IWorkbenchEditorService); + let [left, right, label] = args; + + if (!label) { + label = nls.localize('diffLeftRightLabel', "{0} ⟷ {1}", left.toString(true), right.toString(true)); + } + + return TPromise.join([editorService.inputToType({ resource: left }), editorService.inputToType({ resource: right })]).then(inputs => { + const [left, right] = inputs; + + const diff = new DiffEditorInput(label, undefined, left, right); + return editorService.openEditor(diff); + }).then(() => { + return void 0; + }); + }, + when: undefined, + primary: undefined }); \ No newline at end of file