From c08a45bedafc3370853af1f1c55a7960c736a4ee Mon Sep 17 00:00:00 2001 From: dadlerj Date: Sat, 24 Jun 2017 13:34:10 -0700 Subject: [PATCH 1/3] Don't re-render hovers if nothing has changed --- .../contrib/hover/browser/modesContentHover.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index ff8f4d98be72f..c2f648664313f 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -20,7 +20,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { getHover } from '../common/hover'; import { HoverOperation, IHoverComputer } from './hoverOperation'; import { ContentHoverWidget } from './hoverWidgets'; -import { textToMarkedString, MarkedString } from 'vs/base/common/htmlContent'; +import { textToMarkedString, MarkedString, markedStringsEquals } from 'vs/base/common/htmlContent'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class ModesContentComputer implements IHoverComputer { @@ -194,6 +194,9 @@ export class ModesContentHoverWidget extends ContentHoverWidget { } } if (filteredMessages.length > 0) { + if (hoverContentsEquals(filteredMessages, this._messages)) { + return; + } this._renderMessages(range, filteredMessages); } else { this.hide(); @@ -283,3 +286,15 @@ export class ModesContentHoverWidget extends ContentHoverWidget { className: 'hoverHighlight' }); } + +function hoverContentsEquals(first: Hover[], second: Hover[]): boolean { + if ((!first && second) || (first && !second) || first.length !== second.length) { + return false; + } + for (let i = 0; i < first.length; i++) { + if (!markedStringsEquals(first[i].contents, second[i].contents)) { + return false; + } + } + return true; +} From 575af4d0f81171c7c5495f69d341ea8354aa958f Mon Sep 17 00:00:00 2001 From: dadlerj Date: Sat, 24 Jun 2017 13:35:32 -0700 Subject: [PATCH 2/3] Add hover telemetry --- src/vs/editor/contrib/hover/browser/hover.ts | 6 ++++-- src/vs/editor/contrib/hover/browser/modesContentHover.ts | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index b0229e73f1b1c..910047300aeeb 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -23,6 +23,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @editorContribution export class ModesHoverController implements editorCommon.IEditorContribution { @@ -41,7 +42,8 @@ export class ModesHoverController implements editorCommon.IEditorContribution { constructor(editor: ICodeEditor, @IOpenerService openerService: IOpenerService, - @IModeService modeService: IModeService + @IModeService modeService: IModeService, + @ITelemetryService telemetryService: ITelemetryService ) { this._editor = editor; @@ -60,7 +62,7 @@ export class ModesHoverController implements editorCommon.IEditorContribution { } })); - this._contentWidget = new ModesContentHoverWidget(editor, openerService, modeService); + this._contentWidget = new ModesContentHoverWidget(editor, openerService, modeService, telemetryService); this._glyphWidget = new ModesGlyphHoverWidget(editor, openerService, modeService); } } diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index c2f648664313f..869d3d98551a1 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -22,6 +22,7 @@ import { HoverOperation, IHoverComputer } from './hoverOperation'; import { ContentHoverWidget } from './hoverWidgets'; import { textToMarkedString, MarkedString, markedStringsEquals } from 'vs/base/common/htmlContent'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; class ModesContentComputer implements IHoverComputer { @@ -135,7 +136,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { private _modeService: IModeService; private _shouldFocus: boolean; - constructor(editor: ICodeEditor, openerService: IOpenerService, modeService: IModeService) { + constructor(editor: ICodeEditor, openerService: IOpenerService, modeService: IModeService, private telemetryService: ITelemetryService) { super(ModesContentHoverWidget.ID, editor); this._computer = new ModesContentComputer(this._editor); @@ -270,6 +271,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { }); // show + this.telemetryService.publicLog('editor.contentHoverWidgetDisplayed'); this.showAt(new Position(renderRange.startLineNumber, renderColumn), this._shouldFocus); this.updateContents(fragment); From 8f42e2d154e6e6385f33f6bb13d195e218b9751b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 24 Oct 2017 16:01:32 +0200 Subject: [PATCH 3/3] Remove telemetry related part of the PR --- src/vs/editor/contrib/hover/browser/hover.ts | 7 ++----- src/vs/editor/contrib/hover/browser/modesContentHover.ts | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index 0d6fdfb440d2f..179eb9d2973c6 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -24,7 +24,6 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/browser/markdownRenderer'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @editorContribution export class ModesHoverController implements editorCommon.IEditorContribution { @@ -46,8 +45,7 @@ export class ModesHoverController implements editorCommon.IEditorContribution { constructor(editor: ICodeEditor, @IOpenerService openerService: IOpenerService, - @IModeService modeService: IModeService, - @ITelemetryService telemetryService: ITelemetryService + @IModeService modeService: IModeService ) { this._editor = editor; @@ -67,9 +65,8 @@ export class ModesHoverController implements editorCommon.IEditorContribution { this._hideWidgets(); } })); - const renderer = new MarkdownRenderer(editor, modeService, openerService); - this._contentWidget = new ModesContentHoverWidget(editor, renderer, telemetryService); + this._contentWidget = new ModesContentHoverWidget(editor, renderer); this._glyphWidget = new ModesGlyphHoverWidget(editor, renderer); } } diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index cb8d5e8159344..d6dc2864e1ef8 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -23,7 +23,6 @@ import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetect import { Color, RGBA } from 'vs/base/common/color'; import { IDisposable, empty as EmptyDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; import { getColorPresentations } from 'vs/editor/contrib/colorPicker/common/color'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; const $ = dom.$; class ColorHover { @@ -170,7 +169,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { private renderDisposable: IDisposable = EmptyDisposable; private toDispose: IDisposable[]; - constructor(editor: ICodeEditor, markdownRenderner: MarkdownRenderer, private telemetryService: ITelemetryService) { + constructor(editor: ICodeEditor, markdownRenderner: MarkdownRenderer) { super(ModesContentHoverWidget.ID, editor); this._computer = new ModesContentComputer(this._editor); @@ -392,7 +391,6 @@ export class ModesContentHoverWidget extends ContentHoverWidget { }); // show - this.telemetryService.publicLog('editor.contentHoverWidgetDisplayed'); if (!containColorPicker) { this.showAt(new Position(renderRange.startLineNumber, renderColumn), this._shouldFocus);