tests for mimetype ordering

This commit is contained in:
rebornix
2020-03-04 12:32:45 -08:00
parent 93a642bcf6
commit c4c3fdc355
3 changed files with 359 additions and 125 deletions

View File

@@ -13,7 +13,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle';
import { readonly } from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event';
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
import { INotebookDisplayOrder, parseCellUri, parseCellHandle, ITransformedDisplayOutputDto, IOrderedMimeType, IStreamOutput, IErrorOutput, mimeTypeSupportedByCore, IOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookDisplayOrder, parseCellUri, parseCellHandle, ITransformedDisplayOutputDto, IOrderedMimeType, IStreamOutput, IErrorOutput, mimeTypeSupportedByCore, IOutput, sortMimeTypes, diff } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { ISplice } from 'vs/base/common/sequence';
interface ExtHostOutputDisplayOrder {
@@ -21,67 +21,6 @@ interface ExtHostOutputDisplayOrder {
userOrder?: glob.ParsedPattern[];
}
interface IMutableSplice<T> extends ISplice<T> {
deleteCount: number;
}
function diff<T>(before: T[], after: T[], contains: (a: T) => boolean): ISplice<T>[] {
const result: IMutableSplice<T>[] = [];
function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
if (deleteCount === 0 && toInsert.length === 0) {
return;
}
const latest = result[result.length - 1];
if (latest && latest.start + latest.deleteCount === start) {
latest.deleteCount += deleteCount;
latest.toInsert.push(...toInsert);
} else {
result.push({ start, deleteCount, toInsert });
}
}
let beforeIdx = 0;
let afterIdx = 0;
while (true) {
if (beforeIdx === before.length) {
pushSplice(beforeIdx, 0, after.slice(afterIdx));
break;
}
if (afterIdx === after.length) {
pushSplice(beforeIdx, before.length - beforeIdx, []);
break;
}
const beforeElement = before[beforeIdx];
const afterElement = after[afterIdx];
if (beforeElement === afterElement) {
// equal
beforeIdx += 1;
afterIdx += 1;
continue;
}
if (contains(afterElement)) {
// `afterElement` exists before, which means some elements before `afterElement` are deleted
pushSplice(beforeIdx, 1, []);
beforeIdx += 1;
} else {
// `afterElement` added
pushSplice(beforeIdx, 0, [afterElement]);
afterIdx += 1;
}
}
return result;
}
export class ExtHostCell implements vscode.NotebookCell {
private static _handlePool: number = 0;
@@ -330,9 +269,8 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument, vscode.
let mimeTypes = Object.keys(output.data);
// TODO@rebornix, the document display order might be assigned a bit later. We need to postpone sending the outputs to the core side.
const sorted = mimeTypes.sort((a, b) => {
return this.getMimeTypeOrder(a) - this.getMimeTypeOrder(b);
});
let coreDisplayOrder = this.renderingHandler.outputDisplayOrder;
const sorted = sortMimeTypes(mimeTypes, coreDisplayOrder?.userOrder || [], this._parsedDisplayOrder, coreDisplayOrder?.defaultOrder || []);
let orderMimeTypes: IOrderedMimeType[] = [];
@@ -380,62 +318,6 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument, vscode.
};
}
findRichestMimeType(output: vscode.CellOutput) {
if (output.outputKind === CellOutputKind.Rich) {
let mimeTypes = Object.keys(output.data);
const sorted = mimeTypes.sort((a, b) => {
return this.getMimeTypeOrder(a) - this.getMimeTypeOrder(b);
});
if (sorted.length) {
return sorted[0];
}
}
return undefined;
}
getMimeTypeOrder(mimeType: string) {
let order = 0;
let coreDisplayOrder = this.renderingHandler.outputDisplayOrder;
if (coreDisplayOrder) {
// User order has highest priority
let userDisplayOrder = coreDisplayOrder.userOrder;
if (userDisplayOrder) {
for (let i = 0; i < userDisplayOrder.length; i++) {
if (userDisplayOrder[i](mimeType)) {
return order;
}
order++;
}
}
let documentDisplayOrder = this._parsedDisplayOrder;
for (let i = 0; i < documentDisplayOrder.length; i++) {
if (documentDisplayOrder[i](mimeType)) {
return order;
}
order++;
}
let defaultOrder = coreDisplayOrder.defaultOrder;
for (let i = 0; i < defaultOrder.length; i++) {
if (defaultOrder[i](mimeType)) {
return order;
}
order++;
}
}
return order;
}
getCell(cellHandle: number) {
return this.cells.find(cell => cell.handle === cellHandle);
}