diff --git a/src/vs/base/common/htmlContent.ts b/src/vs/base/common/htmlContent.ts
index ce013b916cc6e5d945f95989a7c6bcd5f6261d6f..b06fe9aaf580250f3fbe5d5d02c5471a3e0ebec7 100644
--- a/src/vs/base/common/htmlContent.ts
+++ b/src/vs/base/common/htmlContent.ts
@@ -6,7 +6,6 @@
'use strict';
import { equals } from 'vs/base/common/arrays';
-import { marked } from 'vs/base/common/marked/marked';
export interface IMarkdownString {
value: string;
@@ -93,16 +92,3 @@ export function removeMarkdownEscapes(text: string): string {
}
return text.replace(/\\([\\`*_{}[\]()#+\-.!])/g, '$1');
}
-
-export function containsCommandLink(value: string): boolean {
- let uses = false;
- const renderer = new marked.Renderer();
- renderer.link = (href, title, text): string => {
- if (href.match(/^command:/i)) {
- uses = true;
- }
- return 'link';
- };
- marked(value, { renderer });
- return uses;
-}
diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts
index 76047ae75686b47df407f17c4133b480433b26e6..907abd5c9e6d3987280e3120b878180a1134cd74 100644
--- a/src/vs/workbench/api/node/extHost.api.impl.ts
+++ b/src/vs/workbench/api/node/extHost.api.impl.ts
@@ -83,7 +83,7 @@ export function createApiFactory(
// Addressable instances
const extHostHeapService = threadService.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService());
- const extHostDocumentsAndEditors = threadService.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(threadService, extensionService));
+ const extHostDocumentsAndEditors = threadService.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(threadService));
const extHostDocuments = threadService.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(threadService, extHostDocumentsAndEditors));
const extHostDocumentContentProviders = threadService.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(threadService, extHostDocumentsAndEditors));
const extHostDocumentSaveParticipant = threadService.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostDocuments, threadService.get(MainContext.MainThreadEditors)));
diff --git a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts
index 8129a12b69a4020aae916da7e3d3cdadb6f23248..da9cc09702c02e1ffacef51e29187a6879b3d32f 100644
--- a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts
+++ b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts
@@ -8,10 +8,9 @@ import Event, { Emitter } from 'vs/base/common/event';
import { dispose } from 'vs/base/common/lifecycle';
import { MainContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IMainContext } from './extHost.protocol';
import { ExtHostDocumentData } from './extHostDocumentData';
-import { ExtHostTextEditor, ExtHostTextEditor2 } from './extHostTextEditor';
+import { ExtHostTextEditor } from './extHostTextEditor';
import * as assert from 'assert';
import * as typeConverters from './extHostTypeConverters';
-import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService';
export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsShape {
@@ -30,8 +29,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha
readonly onDidChangeActiveTextEditor: Event = this._onDidChangeActiveTextEditor.event;
constructor(
- private readonly _mainContext: IMainContext,
- private readonly _extHostExtensions?: ExtHostExtensionService
+ private readonly _mainContext: IMainContext
) {
}
@@ -81,9 +79,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha
assert.ok(!this._editors.has(data.id), `editor '${data.id}' already exists!`);
const documentData = this._documents.get(data.document.toString());
- const editor = new ExtHostTextEditor2(
- this._extHostExtensions,
- this._mainContext.get(MainContext.MainThreadTelemetry),
+ const editor = new ExtHostTextEditor(
this._mainContext.get(MainContext.MainThreadEditors),
data.id,
documentData,
diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts
index b075808bd0f03cb86ea29dce11060e80bfaff5c3..1b9211584d883c94f1b3666f8ea01b0e9982bd37 100644
--- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts
+++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts
@@ -22,9 +22,7 @@ import { MainContext, MainThreadTelemetryShape, MainThreadLanguageFeaturesShape,
import { regExpLeadsToEndlessLoop } from 'vs/base/common/strings';
import { IPosition } from 'vs/editor/common/core/position';
import { IRange } from 'vs/editor/common/core/range';
-import { containsCommandLink } from 'vs/base/common/htmlContent';
import { isFalsyOrEmpty } from 'vs/base/common/arrays';
-import { once } from 'vs/base/common/functional';
// --- adapter
@@ -179,7 +177,6 @@ class HoverAdapter {
constructor(
private readonly _documents: ExtHostDocuments,
private readonly _provider: vscode.HoverProvider,
- private readonly _telemetryLog: (name: string, data: object) => void,
) {
//
}
@@ -200,14 +197,7 @@ class HoverAdapter {
value.range = new Range(pos, pos);
}
- const result = TypeConverters.fromHover(value);
-
- // we wanna know which extension uses command links
- // because that is a potential trick-attack on users
- if (result.contents.some(h => containsCommandLink(h.value))) {
- this._telemetryLog('usesCommandLink', { from: 'hover' });
- }
- return result;
+ return TypeConverters.fromHover(value);
});
}
}
@@ -878,11 +868,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape {
registerHoverProvider(selector: vscode.DocumentSelector, provider: vscode.HoverProvider, extensionId?: string): vscode.Disposable {
const handle = this._nextHandle();
- this._adapter.set(handle, new HoverAdapter(this._documents, provider, once((name: string, data: any) => {
- data['extension'] = extensionId;
- // __GDPR__TODO__ Dynamic event names and dynamic properties. Can not be registered statically.
- this._telemetry.$publicLog(name, data);
- })));
+ this._adapter.set(handle, new HoverAdapter(this._documents, provider));
this._proxy.$registerHoverProvider(handle, selector);
return this._createDisposable(handle);
}
diff --git a/src/vs/workbench/api/node/extHostTextEditor.ts b/src/vs/workbench/api/node/extHostTextEditor.ts
index 562c99258a599d8585ccc63a575b1107ffa2d185..763969acc9696e7534e3e9341202832d33b3430d 100644
--- a/src/vs/workbench/api/node/extHostTextEditor.ts
+++ b/src/vs/workbench/api/node/extHostTextEditor.ts
@@ -6,19 +6,17 @@
import { ok } from 'vs/base/common/assert';
-import { readonly, illegalArgument, V8CallSite } from 'vs/base/common/errors';
+import { readonly, illegalArgument } from 'vs/base/common/errors';
import { IdGenerator } from 'vs/base/common/idGenerator';
import { TPromise } from 'vs/base/common/winjs.base';
import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData';
import { Selection, Range, Position, EndOfLine, TextEditorRevealType, TextEditorLineNumbersStyle, SnippetString } from './extHostTypes';
import { ISingleEditOperation } from 'vs/editor/common/editorCommon';
import * as TypeConverters from './extHostTypeConverters';
-import { MainThreadEditorsShape, MainThreadTelemetryShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from './extHost.protocol';
+import { MainThreadEditorsShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from './extHost.protocol';
import * as vscode from 'vscode';
import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions';
import { IRange } from 'vs/editor/common/core/range';
-import { containsCommandLink } from 'vs/base/common/htmlContent';
-import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService';
export class TextEditorDecorationType implements vscode.TextEditorDecorationType {
@@ -552,79 +550,6 @@ export class ExtHostTextEditor implements vscode.TextEditor {
}
}
-export class ExtHostTextEditor2 extends ExtHostTextEditor {
-
- constructor(
- private readonly _extHostExtensions: ExtHostExtensionService,
- private readonly _mainThreadTelemetry: MainThreadTelemetryShape,
- proxy: MainThreadEditorsShape,
- id: string,
- document: ExtHostDocumentData,
- selections: Selection[],
- options: IResolvedTextEditorConfiguration,
- viewColumn: vscode.ViewColumn
- ) {
- super(proxy, id, document, selections, options, viewColumn);
- }
-
- setDecorations(decorationType: vscode.TextEditorDecorationType, rangesOrOptions: Range[] | vscode.DecorationOptions[]): void {
- // (1) find out if this decoration is important for us
- let usesCommandLink = false;
- outer: for (const rangeOrOption of rangesOrOptions) {
- if (Range.isRange(rangeOrOption)) {
- break;
- }
- if (typeof rangeOrOption.hoverMessage === 'string' && containsCommandLink(rangeOrOption.hoverMessage)) {
- usesCommandLink = true;
- break;
- } else if (Array.isArray(rangeOrOption.hoverMessage)) {
- for (const message of rangeOrOption.hoverMessage) {
- if (typeof message === 'string' && containsCommandLink(message)) {
- usesCommandLink = true;
- break outer;
- }
- }
- }
- }
- // (2) send event for important decorations
- if (usesCommandLink) {
- let tag = new Error();
- this._extHostExtensions.getExtensionPathIndex().then(index => {
- const oldHandler = (Error).prepareStackTrace;
- (Error).prepareStackTrace = (error: Error, stackTrace: V8CallSite[]) => {
- for (const call of stackTrace) {
- const extension = index.findSubstr(call.getFileName());
- if (extension) {
- /* __GDPR__
- "usesCommandLink" : {
- "extension" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
- "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
- "${include}": [
- "${MainThreadData}"
- ]
- }
- */
- this._mainThreadTelemetry.$publicLog('usesCommandLink', {
- extension: extension.id,
- from: 'decoration',
- });
- return;
- }
- }
- };
- // it all happens here...
- // tslint:disable-next-line:no-unused-expression
- tag.stack;
- (Error).prepareStackTrace = oldHandler;
- });
- }
-
- // (3) do it
- super.setDecorations(decorationType, rangesOrOptions);
- }
-}
-
-
function warnOnError(promise: TPromise): void {
promise.then(null, (err) => {
console.warn(err);