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