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);