diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index a5ad6e6ef79..4a8459de66c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -22,6 +22,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { CellEditState, ICellOutputViewModel, ICommonCellInfo, ICommonNotebookEditor, IDisplayOutputLayoutUpdateRequest, IDisplayOutputViewModel, IGenericCellViewModel, IInsetRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { preloadsScriptStr } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads'; @@ -162,6 +163,15 @@ export interface IInitializedMarkdownPreviewMessage extends BaseToWebviewMessage readonly type: 'initializedMarkdownPreview'; } +export interface ITelemetryFoundRenderedMarkdownMath extends BaseToWebviewMessage { + readonly type: 'telemetryFoundRenderedMarkdownMath'; +} + +export interface ITelemetryFoundUnrenderedMarkdownMath extends BaseToWebviewMessage { + readonly type: 'telemetryFoundUnrenderedMarkdownMath'; + readonly latexDirective: string; +} + export interface IClearMessage { type: 'clear'; } @@ -339,7 +349,10 @@ export type FromWebviewMessage = | ICellDropMessage | ICellDragEndMessage | IInitializedMarkdownPreviewMessage + | ITelemetryFoundRenderedMarkdownMath + | ITelemetryFoundUnrenderedMarkdownMath ; + export type ToWebviewMessage = | IClearMessage | IFocusOutputMessage @@ -426,6 +439,7 @@ export class BackLayerWebView extends Disposable { @IContextMenuService private readonly contextMenuService: IContextMenuService, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, + @ITelemetryService private readonly telemetryService: ITelemetryService, ) { super(); @@ -1054,6 +1068,27 @@ var requirejs = (function() { this.notebookEditor.markdownCellDragEnd(data.cellId); break; } + + case 'telemetryFoundRenderedMarkdownMath': + { + this.telemetryService.publicLog2<{}, {}>('notebook/markdown/renderedLatex', {}); + break; + } + case 'telemetryFoundUnrenderedMarkdownMath': + { + type Classification = { + latexDirective: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + }; + + type TelemetryEvent = { + latexDirective: string; + }; + + this.telemetryService.publicLog2('notebook/markdown/foundUnrenderedLatex', { + latexDirective: data.latexDirective + }); + break; + } } })); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index b514ae9ddf3..6bbced710ce 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -6,7 +6,7 @@ import type { Event } from 'vs/base/common/event'; import type { IDisposable } from 'vs/base/common/lifecycle'; import { RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { FromWebviewMessage, IBlurOutputMessage, ICellDropMessage, ICellDragMessage, ICellDragStartMessage, IClickedDataUrlMessage, ICustomRendererMessage, IDimensionMessage, IClickMarkdownPreviewMessage, IMouseEnterMarkdownPreviewMessage, IMouseEnterMessage, IMouseLeaveMarkdownPreviewMessage, IMouseLeaveMessage, IToggleMarkdownPreviewMessage, IWheelMessage, ToWebviewMessage, ICellDragEndMessage, IOutputFocusMessage, IOutputBlurMessage, DimensionUpdate, IContextMenuMarkdownPreviewMessage } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; +import { FromWebviewMessage, IBlurOutputMessage, ICellDropMessage, ICellDragMessage, ICellDragStartMessage, IClickedDataUrlMessage, ICustomRendererMessage, IDimensionMessage, IClickMarkdownPreviewMessage, IMouseEnterMarkdownPreviewMessage, IMouseEnterMessage, IMouseLeaveMarkdownPreviewMessage, IMouseLeaveMessage, IToggleMarkdownPreviewMessage, IWheelMessage, ToWebviewMessage, ICellDragEndMessage, IOutputFocusMessage, IOutputBlurMessage, DimensionUpdate, IContextMenuMarkdownPreviewMessage, ITelemetryFoundRenderedMarkdownMath, ITelemetryFoundUnrenderedMarkdownMath } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; // !! IMPORTANT !! everything must be in-line within the webviewPreloads // function. Imports are not allowed. This is stringifies and injected into @@ -894,6 +894,9 @@ function webviewPreloads() { }); } + let hasPostedRenderedMathTelemetry = false; + const unsupportedKatexTermsRegex = /(\\(?:abovewithdelims|array|Arrowvert|arrowvert|atopwithdelims|bbox|bracevert|buildrel|cancelto|cases|class|cssId|ddddot|dddot|DeclareMathOperator|definecolor|displaylines|enclose|eqalign|eqalignno|eqref|hfil|hfill|idotsint|iiiint|label|leftarrowtail|leftroot|leqalignno|lower|mathtip|matrix|mbox|mit|mmlToken|moveleft|moveright|mspace|newenvironment|Newextarrow|notag|oldstyle|overparen|overwithdelims|pmatrix|raise|ref|renewenvironment|require|root|Rule|scr|shoveleft|shoveright|sideset|skew|Space|strut|style|texttip|Tiny|toggle|underparen|unicode|uproot)\b)/g; + function updateMarkdownPreview(cellId: string, content: string | undefined) { const previewContainerNode = document.getElementById(cellId); if (!previewContainerNode) { @@ -914,6 +917,21 @@ function webviewPreloads() { element: previewNode, content: content }]); + + if (!hasPostedRenderedMathTelemetry) { + const hasRenderedMath = previewNode.querySelector('.katex'); + if (hasRenderedMath) { + hasPostedRenderedMathTelemetry = true; + postNotebookMessage('telemetryFoundRenderedMarkdownMath', {}); + } + } + + const matches = previewNode.innerText.match(unsupportedKatexTermsRegex); + if (matches) { + postNotebookMessage('telemetryFoundUnrenderedMarkdownMath', { + latexDirective: matches[0], + }); + } } }