in src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts [386:655]
private _initialize(content: string) {
if (!document.body.contains(this.element)) {
throw new Error('Element is already detached from the DOM tree');
}
this.webview = this._createInset(this.webviewService, content);
this.webview.mountTo(this.element);
this._register(this.webview);
this._register(this.webview.onDidClickLink(link => {
if (this._disposed) {
return;
}
if (!link) {
return;
}
if (matchesScheme(link, Schemas.command)) {
console.warn('Command links are deprecated and will be removed, use messag passing instead: https://github.com/microsoft/vscode/issues/123601');
}
if (matchesScheme(link, Schemas.http) || matchesScheme(link, Schemas.https) || matchesScheme(link, Schemas.mailto)
|| matchesScheme(link, Schemas.command)) {
this.openerService.open(link, { fromUserGesture: true, allowContributedOpeners: true, allowCommands: true });
}
}));
this._register(this.webview.onMessage((message) => {
const data: FromWebviewMessage /*| { readonly __vscode_notebook_message: undefined }*/ = message.message; // {{SQL CARBON EDIT}} Fix compile error
if (this._disposed) {
return;
}
if (!data.__vscode_notebook_message) {
return;
}
switch (data.type) {
case 'initialized':
this.initializeWebViewState();
break;
case 'dimension':
{
for (const update of data.updates) {
const height = update.height;
if (update.isOutput) {
const resolvedResult = this.resolveOutputId(update.id);
if (resolvedResult) {
const { cellInfo, output } = resolvedResult;
this.notebookEditor.updateOutputHeight(cellInfo, output, height, !!update.init, 'webview#dimension');
this.notebookEditor.scheduleOutputHeightAck(cellInfo, update.id, height);
}
} else {
this.notebookEditor.updateMarkupCellHeight(update.id, height, !!update.init);
}
}
break;
}
case 'mouseenter':
{
const resolvedResult = this.resolveOutputId(data.id);
if (resolvedResult) {
const latestCell = this.notebookEditor.getCellByInfo(resolvedResult.cellInfo);
if (latestCell) {
latestCell.outputIsHovered = true;
}
}
break;
}
case 'mouseleave':
{
const resolvedResult = this.resolveOutputId(data.id);
if (resolvedResult) {
const latestCell = this.notebookEditor.getCellByInfo(resolvedResult.cellInfo);
if (latestCell) {
latestCell.outputIsHovered = false;
}
}
break;
}
case 'outputFocus':
{
const resolvedResult = this.resolveOutputId(data.id);
if (resolvedResult) {
const latestCell = this.notebookEditor.getCellByInfo(resolvedResult.cellInfo);
if (latestCell) {
latestCell.outputIsFocused = true;
}
}
break;
}
case 'outputBlur':
{
const resolvedResult = this.resolveOutputId(data.id);
if (resolvedResult) {
const latestCell = this.notebookEditor.getCellByInfo(resolvedResult.cellInfo);
if (latestCell) {
latestCell.outputIsFocused = false;
}
}
break;
}
case 'scroll-ack':
{
// const date = new Date();
// const top = data.data.top;
// console.log('ack top ', top, ' version: ', data.version, ' - ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds());
break;
}
case 'scroll-to-reveal':
{
this.notebookEditor.setScrollTop(data.scrollTop);
break;
}
case 'did-scroll-wheel':
{
this.notebookEditor.triggerScroll({
...data.payload,
preventDefault: () => { },
stopPropagation: () => { }
});
break;
}
case 'focus-editor':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell) {
if (data.focusNext) {
this.notebookEditor.focusNextNotebookCell(cell, 'editor');
} else {
this.notebookEditor.focusNotebookCell(cell, 'editor');
}
}
break;
}
case 'clicked-data-url':
{
this._onDidClickDataLink(data);
break;
}
case 'customKernelMessage':
{
this._onMessage.fire({ message: data.message });
break;
}
case 'customRendererMessage':
{
this.rendererMessaging?.postMessage(data.rendererId, data.message);
break;
}
case 'clickMarkupCell':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell) {
if (data.shiftKey || (isMacintosh ? data.metaKey : data.ctrlKey)) {
// Modify selection
this.notebookEditor.toggleNotebookCellSelection(cell, /* fromPrevious */ data.shiftKey);
} else {
// Normal click
this.notebookEditor.focusNotebookCell(cell, 'container', { skipReveal: true });
}
}
break;
}
case 'contextMenuMarkupCell':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell) {
// Focus the cell first
this.notebookEditor.focusNotebookCell(cell, 'container', { skipReveal: true });
// Then show the context menu
const webviewRect = this.element.getBoundingClientRect();
this.contextMenuService.showContextMenu({
getActions: () => {
const result: IAction[] = [];
const menu = this.menuService.createMenu(MenuId.NotebookCellTitle, this.contextKeyService);
createAndFillInContextMenuActions(menu, undefined, result);
menu.dispose();
return result;
},
getAnchor: () => ({
x: webviewRect.x + data.clientX,
y: webviewRect.y + data.clientY
})
});
}
break;
}
case 'toggleMarkupPreview':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell && !this.notebookEditor.creationOptions.isReadOnly) {
this.notebookEditor.setMarkupCellEditState(data.cellId, CellEditState.Editing);
this.notebookEditor.focusNotebookCell(cell, 'editor', { skipReveal: true });
}
break;
}
case 'mouseEnterMarkupCell':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell instanceof MarkupCellViewModel) {
cell.cellIsHovered = true;
}
break;
}
case 'mouseLeaveMarkupCell':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell instanceof MarkupCellViewModel) {
cell.cellIsHovered = false;
}
break;
}
case 'cell-drag-start':
{
this.notebookEditor.didStartDragMarkupCell(data.cellId, data);
break;
}
case 'cell-drag':
{
this.notebookEditor.didDragMarkupCell(data.cellId, data);
break;
}
case 'cell-drop':
{
this.notebookEditor.didDropMarkupCell(data.cellId, {
dragOffsetY: data.dragOffsetY,
ctrlKey: data.ctrlKey,
altKey: data.altKey,
});
break;
}
case 'cell-drag-end':
{
this.notebookEditor.didEndDragMarkupCell(data.cellId);
break;
}
case 'renderedMarkup':
{
const cell = this.notebookEditor.getCellById(data.cellId);
if (cell instanceof MarkupCellViewModel) {
cell.renderedHtml = data.html;
}
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<TelemetryEvent, Classification>('notebook/markdown/foundUnrenderedLatex', {
latexDirective: data.latexDirective
});
break;
}
}
}));
}