فهرست منبع

Move trusted to options

Steven Silvester 7 سال پیش
والد
کامیت
54a0c193f4

+ 0 - 2
examples/app/index.js

@@ -16,7 +16,6 @@ var mods = [
   require('@jupyterlab/console-extension'),
   require('@jupyterlab/csvviewer-extension'),
   require('@jupyterlab/docmanager-extension'),
-  require('@jupyterlab/docregistry-extension'),
   require('@jupyterlab/fileeditor-extension'),
   require('@jupyterlab/faq-extension'),
   require('@jupyterlab/filebrowser-extension'),
@@ -26,7 +25,6 @@ var mods = [
   require('@jupyterlab/launcher-extension'),
   require('@jupyterlab/markdownviewer-extension'),
   require('@jupyterlab/notebook-extension'),
-  require('@jupyterlab/rendermime-extension'),
   require('@jupyterlab/running-extension'),
   require('@jupyterlab/services-extension'),
   require('@jupyterlab/settingeditor-extension'),

+ 0 - 2
examples/app/package.json

@@ -14,7 +14,6 @@
     "@jupyterlab/console-extension": "^0.7.0",
     "@jupyterlab/csvviewer-extension": "^0.7.1",
     "@jupyterlab/docmanager-extension": "^0.7.0",
-    "@jupyterlab/docregistry-extension": "^0.7.0",
     "@jupyterlab/faq-extension": "^0.7.0",
     "@jupyterlab/filebrowser-extension": "^0.7.0",
     "@jupyterlab/fileeditor-extension": "^0.7.0",
@@ -24,7 +23,6 @@
     "@jupyterlab/launcher-extension": "^0.7.1",
     "@jupyterlab/markdownviewer-extension": "^0.7.0",
     "@jupyterlab/notebook-extension": "^0.7.0",
-    "@jupyterlab/rendermime-extension": "^0.7.0",
     "@jupyterlab/running-extension": "^0.7.0",
     "@jupyterlab/services-extension": "^0.7.0",
     "@jupyterlab/settingeditor-extension": "^0.2.0",

+ 0 - 1
jupyterlab/index.js

@@ -9,7 +9,6 @@ require('font-awesome/css/font-awesome.min.css');
 require('@jupyterlab/theming/style/index.css');
 
 var app = require('@jupyterlab/application').JupyterLab;
-var RenderMime = require('@jupyterlab/rendermime').RenderMime;
 
 function main() {
     var version = PageConfig.getOption('appVersion') || 'unknown';

+ 0 - 3
packages/all-packages/package.json

@@ -33,7 +33,6 @@
     "@jupyterlab/docmanager": "^0.7.0",
     "@jupyterlab/docmanager-extension": "^0.7.0",
     "@jupyterlab/docregistry": "^0.7.0",
-    "@jupyterlab/docregistry-extension": "^0.7.0",
     "@jupyterlab/faq-extension": "^0.7.0",
     "@jupyterlab/filebrowser": "^0.7.0",
     "@jupyterlab/filebrowser-extension": "^0.7.0",
@@ -46,13 +45,11 @@
     "@jupyterlab/inspector-extension": "^0.7.0",
     "@jupyterlab/launcher": "^0.7.0",
     "@jupyterlab/launcher-extension": "^0.7.1",
-    "@jupyterlab/markdownviewer": "^0.7.0",
     "@jupyterlab/markdownviewer-extension": "^0.7.0",
     "@jupyterlab/notebook": "^0.7.0",
     "@jupyterlab/notebook-extension": "^0.7.0",
     "@jupyterlab/outputarea": "^0.7.0",
     "@jupyterlab/rendermime": "^0.7.0",
-    "@jupyterlab/rendermime-extension": "^0.7.0",
     "@jupyterlab/running": "^0.7.0",
     "@jupyterlab/running-extension": "^0.7.0",
     "@jupyterlab/services": "^0.46.0",

+ 0 - 3
packages/all-packages/src/index.ts

@@ -21,7 +21,6 @@ import "@jupyterlab/csvviewer-extension";
 import "@jupyterlab/docmanager";
 import "@jupyterlab/docmanager-extension";
 import "@jupyterlab/docregistry";
-import "@jupyterlab/docregistry-extension";
 import "@jupyterlab/fileeditor";
 import "@jupyterlab/fileeditor-extension";
 import "@jupyterlab/faq-extension";
@@ -34,13 +33,11 @@ import "@jupyterlab/inspector";
 import "@jupyterlab/inspector-extension";
 import "@jupyterlab/launcher";
 import "@jupyterlab/launcher-extension";
-import "@jupyterlab/markdownviewer";
 import "@jupyterlab/markdownviewer-extension";
 import "@jupyterlab/notebook";
 import "@jupyterlab/notebook-extension";
 import "@jupyterlab/outputarea";
 import "@jupyterlab/rendermime";
-import "@jupyterlab/rendermime-extension";
 import "@jupyterlab/running";
 import "@jupyterlab/running-extension";
 import "@jupyterlab/services";

+ 12 - 19
packages/application/src/index.ts

@@ -63,13 +63,13 @@ class JupyterLab extends Application<ApplicationShell> {
     let linker = new CommandLinker({ commands: this.commands });
     this.commandLinker = linker;
 
-    let items = Private.getDefaultRendererItems();
     let linkHandler = {
       handleLink: (node: HTMLElement, path: string) => {
         linker.connectNode(node, 'file-operations:open', { path });
       }
     };
-    this.rendermime = new RenderMime({ items, linkHandler });
+    this.rendermime = new RenderMime({ linkHandler });
+    Private.populateRenderers(this.rendermime);
 
     let registry = this.docRegistry = new DocumentRegistry();
     registry.addModelFactory(new TextModelFactory());
@@ -261,28 +261,21 @@ namespace Private {
    * Get an array of the default renderer items.
    */
   export
-  function getDefaultRendererItems(): RenderMime.IRendererItem[] {
+  function populateRenderers(rendermime: RenderMime): void {
     let renderers = [
-    new JavaScriptRenderer(),
-    new HTMLRenderer(),
-    new MarkdownRenderer(),
-    new LatexRenderer(),
-    new SVGRenderer(),
-    new ImageRenderer(),
-    new PDFRenderer(),
-    new TextRenderer()
+      new JavaScriptRenderer(),
+      new HTMLRenderer(),
+      new MarkdownRenderer(),
+      new LatexRenderer(),
+      new SVGRenderer(),
+      new ImageRenderer(),
+      new PDFRenderer(),
+      new TextRenderer()
     ];
-    let items: RenderMime.IRendererItem[] = [];
-    let mimes: { [key: string]: boolean } = {};
     for (let renderer of renderers) {
       for (let mime of renderer.mimeTypes) {
-        if (mime in mimes) {
-          continue;
-        }
-        mimes[mime] = true;
-        items.push({ mimeType: mime, renderer });
+        rendermime.addFactory(renderer, mime);
       }
     }
-    return items;
   }
 }

+ 5 - 7
packages/application/src/mimerenderers.ts

@@ -58,13 +58,11 @@ function createRendermimePlugin(item: IRenderMime.IExtension): JupyterLabPlugin<
     autoStart: true,
     activate: (app: JupyterLab, restorer: ILayoutRestorer) => {
       // Add the mime renderer.
-      app.rendermime.addRenderer({
-        mimeType: item.mimeType,
-        renderer: item.renderer
-      }, item.rendererIndex || 0);
+      let index = item.rendererIndex || -1;
+      app.rendermime.addFactory(item.rendererFactory, item.mimeType, index);
 
       // Handle the widget factory.
-      if (!item.widgetFactoryOptions) {
+      if (!item.documentWidgetFactoryOptions) {
         return;
       }
 
@@ -73,11 +71,11 @@ function createRendermimePlugin(item: IRenderMime.IExtension): JupyterLabPlugin<
         renderTimeout: item.renderTimeout,
         dataType: item.dataType,
         rendermime: app.rendermime,
-        ...item.widgetFactoryOptions,
+        ...item.documentWidgetFactoryOptions,
       });
       app.docRegistry.addWidgetFactory(factory);
 
-      const factoryName = item.widgetFactoryOptions.name;
+      const factoryName = factory.name;
       const namespace = `${factoryName}-renderer`;
       const tracker = new InstanceTracker<MimeRenderer>({ namespace });
 

+ 21 - 38
packages/cells/src/widget.ts

@@ -8,7 +8,7 @@ import {
 } from '@jupyterlab/services';
 
 import {
-  JSONObject, JSONValue, PromiseDelegate
+  JSONValue, PromiseDelegate
 } from '@phosphor/coreutils';
 
 import {
@@ -36,7 +36,7 @@ import {
 } from '@jupyterlab/docregistry';
 
 import {
-  MimeModel, RenderMime
+  IRenderMime, MimeModel, RenderMime
 } from '@jupyterlab/rendermime';
 
 import {
@@ -749,7 +749,11 @@ class MarkdownCell extends Cell {
   constructor(options: MarkdownCell.IOptions) {
     super(options);
     this.addClass(MARKDOWN_CELL_CLASS);
-    this._rendermime = options.rendermime;
+    this._renderer = options.rendermime.createRenderer(
+      'text/markdown', false
+    );
+    this._renderer.addClass(MARKDOWN_OUTPUT_CLASS);
+    this._mimeModel = new MimeModel({ trusted: false });
 
     // Throttle the rendering rate of the widget.
     this._monitor = new ActivityMonitor({
@@ -761,6 +765,10 @@ class MarkdownCell extends Cell {
         this.update();
       }
     }, this);
+
+    this._updateRenderedInput().then(() => {
+      this._ready.resolve(void 0);
+    });
   }
 
   /**
@@ -805,18 +813,6 @@ class MarkdownCell extends Cell {
     this.inputArea.showEditor();
   }
 
-  /**
-   * Dispose of the resource held by the widget.
-   */
-  dispose(): void {
-    if (this.isDisposed) {
-      return;
-    }
-    this._renderedInput = null;
-    this._rendermime = null;
-    super.dispose();
-  }
-
   /*
    * Handle `update-request` messages.
    */
@@ -834,44 +830,31 @@ class MarkdownCell extends Cell {
       this.showEditor();
     } else {
       this._updateRenderedInput();
-      this.renderInput(this._renderedInput);
+      this.renderInput(this._renderer);
     }
   }
 
   /**
    * Update the rendered input.
    */
-  private _updateRenderedInput(): void {
+  private _updateRenderedInput(): Promise<void> {
     let model = this.model;
     let text = model && model.value.text || DEFAULT_MARKDOWN_TEXT;
-    let trusted = this.model.trusted;
-    // Do not re-render if the text has not changed and the trusted
-    // has not changed.
-    if (text !== this._prevText || trusted !== this._prevTrusted) {
-      let data: JSONObject = { 'text/markdown': text };
-      let bundle = new MimeModel({ data, trusted });
-      let widget = this._rendermime.render(bundle);
-      if (!this._isReady) {
-        widget.ready.then(() => {
-          this._isReady = true;
-          this._ready.resolve(undefined);
-        });
-      }
-      this._renderedInput = widget || new Widget();
-      this._renderedInput.addClass(MARKDOWN_OUTPUT_CLASS);
+    // Do not re-render if the text has not changed.
+    if (text !== this._prevText) {
+      this._mimeModel.data.set('text/markdown', text);
+      this._prevText = text;
+      return this._renderer.render(this._mimeModel);
     }
-    this._prevText = text;
-    this._prevTrusted = trusted;
+    return Promise.resolve(void 0);
   }
 
   private _monitor: ActivityMonitor<any, any> = null;
-  private _rendermime: RenderMime = null;
-  private _renderedInput: Widget = null;
+  private _renderer: IRenderMime.IRendererWidget = null;
+  private _mimeModel: IRenderMime.IMimeModel;
   private _rendered = true;
   private _prevText = '';
-  private _prevTrusted = false;
   private _ready = new PromiseDelegate<void>();
-  private _isReady = false;
 }
 
 

+ 1 - 1
packages/docregistry/src/default.ts

@@ -570,7 +570,7 @@ class MimeRendererFactory extends ABCWidgetFactory<MimeRenderer, DocumentRegistr
    * Construct a new markdown widget factory.
    */
   constructor(options: MimeRendererFactory.IOptions) {
-    super(options);
+    super({ ...options, readOnly: true });
     this._rendermime = options.rendermime;
     this._mimeType = options.mimeType;
     this._renderTimeout = options.renderTimeout || 1000;

+ 5 - 2
packages/inspector/src/handler.ts

@@ -186,9 +186,12 @@ class InspectionHandler implements IDisposable, IInspector.IInspectable {
 
       const data = value.data;
       const trusted = true;
-      const model = new MimeModel({ data, trusted });
+      const model = new MimeModel({ data });
 
-      update.content =  this._rendermime.render(model);
+      const mimeType = this._rendermime.preferredMimeType(model, trusted);
+      let widget = this._rendermime.createRenderer(mimeType, trusted);
+      widget.render(model);
+      update.content = widget;
       this._inspected.emit(update);
     });
   }

+ 6 - 7
packages/markdownviewer-extension/src/index.ts

@@ -10,8 +10,8 @@ import {
 } from '@jupyterlab/apputils';
 
 import {
-  MarkdownViewer, MarkdownViewerFactory
-} from '@jupyterlab/markdownviewer';
+  MimeRendererFactory, MimeRenderer
+} from '@jupyterlab/docregistry';
 
 
 /**
@@ -49,16 +49,17 @@ const plugin: JupyterLabPlugin<void> = {
  * Activate the markdown plugin.
  */
 function activate(app: JupyterLab, restorer: ILayoutRestorer) {
-    const factory = new MarkdownViewerFactory({
+    const factory = new MimeRendererFactory({
       name: FACTORY,
       fileExtensions: ['.md'],
-      readOnly: true,
+      mimeType: 'text/markdown',
       rendermime: app.rendermime
     });
+    app.docRegistry.addWidgetFactory(factory);
 
     const { commands } = app;
     const namespace = 'rendered-markdown';
-    const tracker = new InstanceTracker<MarkdownViewer>({ namespace });
+    const tracker = new InstanceTracker<MimeRenderer>({ namespace });
 
     // Handle state restoration.
     restorer.restore(tracker, {
@@ -74,8 +75,6 @@ function activate(app: JupyterLab, restorer: ILayoutRestorer) {
       tracker.add(widget);
     });
 
-    app.docRegistry.addWidgetFactory(factory);
-
     commands.addCommand(CommandIDs.preview, {
       label: 'Markdown Preview',
       execute: (args) => {

+ 0 - 41
packages/markdownviewer/package.json

@@ -1,41 +0,0 @@
-{
-  "name": "@jupyterlab/markdownviewer",
-  "version": "0.7.0",
-  "description": "JupyterLab - Markdown Renderer",
-  "main": "lib/index.js",
-  "types": "lib/index.d.ts",
-  "files": [
-    "lib/*.d.ts",
-    "lib/*.js",
-    "style/*.css"
-  ],
-  "directories": {
-    "lib": "lib/"
-  },
-  "dependencies": {
-    "@jupyterlab/coreutils": "^0.7.0",
-    "@jupyterlab/docregistry": "^0.7.0",
-    "@jupyterlab/rendermime": "^0.7.0",
-    "@phosphor/messaging": "^1.2.1",
-    "@phosphor/widgets": "^1.3.0"
-  },
-  "devDependencies": {
-    "rimraf": "^2.5.2",
-    "typescript": "~2.3.1"
-  },
-  "scripts": {
-    "build": "tsc",
-    "clean": "rimraf lib",
-    "watch": "tsc -w"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jupyterlab/jupyterlab.git"
-  },
-  "author": "Project Jupyter",
-  "license": "BSD-3-Clause",
-  "bugs": {
-    "url": "https://github.com/jupyterlab/jupyterlab/issues"
-  },
-  "homepage": "https://github.com/jupyterlab/jupyterlab"
-}

+ 0 - 6
packages/markdownviewer/src/index.ts

@@ -1,6 +0,0 @@
-// Copyright (c) Jupyter Development Team.
-// Distributed under the terms of the Modified BSD License.
-
-import '../style/index.css';
-
-export * from './widget';

+ 0 - 193
packages/markdownviewer/src/widget.ts

@@ -1,193 +0,0 @@
-// Copyright (c) Jupyter Development Team.
-// Distributed under the terms of the Modified BSD License.
-
-import {
-  PromiseDelegate
-} from '@phosphor/coreutils';
-
-import {
-  Message
-} from '@phosphor/messaging';
-
-import {
-  PanelLayout
-} from '@phosphor/widgets';
-
-import {
-  Widget
-} from '@phosphor/widgets';
-
-import {
-  ActivityMonitor
-} from '@jupyterlab/coreutils';
-
-import {
-  DocumentRegistry, ABCWidgetFactory
-} from '@jupyterlab/docregistry';
-
-import {
-  MimeModel, RenderMime
-} from '@jupyterlab/rendermime';
-
-
-/**
- * The class name added to a Jupyter MarkdownViewer
- */
-const MD_CLASS = 'jp-MarkdownViewer';
-
-/**
- * The timeout to wait for change activity to have ceased before rendering.
- */
-const RENDER_TIMEOUT = 1000;
-
-
-/**
- * A widget for rendered markdown.
- */
-export
-class MarkdownViewer extends Widget implements DocumentRegistry.IReadyWidget {
-  /**
-   * Construct a new markdown widget.
-   */
-  constructor(context: DocumentRegistry.Context, rendermime: RenderMime) {
-    super();
-    this.addClass(MD_CLASS);
-    let layout = this.layout = new PanelLayout();
-    let toolbar = new Widget();
-    toolbar.addClass('jp-Toolbar');
-    layout.addWidget(toolbar);
-    this.title.label = context.path.split('/').pop();
-    this._rendermime = rendermime;
-    rendermime.resolver = context;
-    this._context = context;
-
-    context.pathChanged.connect(this._onPathChanged, this);
-
-    this._context.ready.then(() => {
-      return this._render().ready;
-    }).then(() => {
-      this._ready.resolve(undefined);
-
-      // Throttle the rendering rate of the widget.
-      this._monitor = new ActivityMonitor({
-        signal: context.model.contentChanged,
-        timeout: RENDER_TIMEOUT
-      });
-      this._monitor.activityStopped.connect(this.update, this);
-    });
-  }
-
-  /**
-   * The markdown widget's context.
-   */
-  get context(): DocumentRegistry.Context {
-    return this._context;
-  }
-
-  /**
-   * A promise that resolves when the markdown viewer is ready.
-   */
-  get ready(): Promise<void> {
-    return this._ready.promise;
-  }
-
-  /**
-   * Dispose of the resources held by the widget.
-   */
-  dispose(): void {
-    if (this.isDisposed) {
-      return;
-    }
-    if (this._monitor) {
-      this._monitor.dispose();
-    }
-    super.dispose();
-  }
-
-  /**
-   * Handle `'activate-request'` messages.
-   */
-  protected onActivateRequest(msg: Message): void {
-    this.node.tabIndex = -1;
-    this.node.focus();
-  }
-
-  /**
-   * Handle an `update-request` message to the widget.
-   */
-  protected onUpdateRequest(msg: Message): void {
-    this._render();
-  }
-
-  /**
-   * Render the markdown content.
-   */
-  private _render(): DocumentRegistry.IReadyWidget {
-    let context = this._context;
-    let model = context.model;
-    let layout = this.layout as PanelLayout;
-    let data = { 'text/markdown': model.toString() };
-    let mimeModel = new MimeModel({ data, trusted: false });
-    let widget = this._rendermime.render(mimeModel);
-    if (layout.widgets.length === 2) {
-      // The toolbar is layout.widgets[0]
-      layout.widgets[1].dispose();
-    }
-    layout.addWidget(widget);
-    return widget;
-  }
-
-  /**
-   * Handle a path change.
-   */
-  private _onPathChanged(): void {
-    this.title.label = this._context.path.split('/').pop();
-  }
-
-  private _context: DocumentRegistry.Context = null;
-  private _monitor: ActivityMonitor<any, any> = null;
-  private _rendermime: RenderMime = null;
-  private _ready = new PromiseDelegate<void>();
-}
-
-
-/**
- * A widget factory for Markdown.
- */
-export
-class MarkdownViewerFactory extends ABCWidgetFactory<MarkdownViewer, DocumentRegistry.IModel> {
-  /**
-   * Construct a new markdown widget factory.
-   */
-  constructor(options: MarkdownViewerFactory.IOptions) {
-    super(options);
-    this._rendermime = options.rendermime;
-  }
-
-  /**
-   * Create a new widget given a context.
-   */
-  protected createNewWidget(context: DocumentRegistry.Context): MarkdownViewer {
-    return new MarkdownViewer(context, this._rendermime.clone());
-  }
-
-  private _rendermime: RenderMime = null;
-}
-
-
-/**
- * A namespace for `MarkdownViewerFactory` statics.
- */
-export
-namespace MarkdownViewerFactory {
-  /**
-   * The options used to create a markdown widget factory.
-   */
-  export
-  interface IOptions extends DocumentRegistry.IWidgetFactoryOptions {
-    /**
-     * A rendermime instance.
-     */
-    rendermime: RenderMime;
-  }
-}

+ 0 - 35
packages/markdownviewer/style/index.css

@@ -1,35 +0,0 @@
-/*-----------------------------------------------------------------------------
-| Copyright (c) Jupyter Development Team.
-| Distributed under the terms of the Modified BSD License.
-|----------------------------------------------------------------------------*/
-
-:root {
-  --jp-private-markdownviewer-padding: 16px;
-}
-
-.jp-MarkdownViewer {
-  border-top: var(--jp-border-width) solid var(--jp-border-color2);
-  outline: none;
-  overflow: hidden;
-  margin-top: -1px;
-  display: flex;
-  flex-direction: column;
-}
-
-
-.jp-MarkdownViewer .jp-Toolbar {
-    display: block;
-    height: var(--jp-toolbar-micro-height);
-    background: var(--jp-toolbar-background);
-    border-bottom: 1px solid var(--jp-toolbar-border-color);
-    box-shadow: var(--jp-toolbar-box-shadow);
-    z-index: 1;
-}
-
-.jp-MarkdownViewer .jp-RenderedMarkdown {
-  padding-top: calc( var(--jp-private-markdownviewer-padding) + var(--jp-toolbar-micro-height) );
-  padding-right: var(--jp-private-markdownviewer-padding);
-  padding-bottom: var(--jp-private-markdownviewer-padding);
-  padding-left: var(--jp-private-markdownviewer-padding);
-  overflow: auto;
-}

+ 0 - 15
packages/markdownviewer/tsconfig.json

@@ -1,15 +0,0 @@
-{
-  "compilerOptions": {
-    "declaration": true,
-    "noImplicitAny": true,
-    "noEmitOnError": true,
-    "noUnusedLocals": true,
-    "module": "commonjs",
-    "moduleResolution": "node",
-    "target": "ES5",
-    "outDir": "./lib",
-    "lib": ["ES5", "ES2015.Promise", "DOM", "ES2015.Collection"],
-    "types": []
-  },
-  "include": ["src/*"]
-}

+ 3 - 1
packages/outputarea/src/widget.ts

@@ -414,7 +414,9 @@ class OutputArea extends Widget {
     prompt.addClass(OUTPUT_AREA_PROMPT_CLASS);
     panel.addWidget(prompt);
 
-    let output = this.rendermime.render(model);
+    let mimeType = this.rendermime.preferredMimeType(model, model.trusted);
+    let output = this.rendermime.createRenderer(mimeType, model.trusted);
+    output.render(model);
     output.addClass(OUTPUT_AREA_OUTPUT_CLASS);
     panel.addWidget(output);
 

+ 0 - 5
packages/rendermime-interfaces/src/index.ts

@@ -20,11 +20,6 @@ namespace IRenderMime {
    */
   export
   interface IMimeModel {
-    /**
-     * Whether the model is trusted.
-     */
-    readonly trusted: boolean;
-
     /**
      * The data associated with the model.
      */

+ 5 - 0
packages/rendermime/src/outputmodel.ts

@@ -43,6 +43,11 @@ interface IOutputModel extends IRenderMime.IMimeModel {
    */
   readonly metadata: IObservableJSON;
 
+  /**
+   * Whether the output is trusted.
+   */
+  trusted: boolean;
+
   /**
    * Dispose of the resources used by the output model.
    */

+ 4 - 2
packages/rendermime/src/rendermime.ts

@@ -97,15 +97,17 @@ class RenderMime {
    *
    * @param model - the mime model of interest.
    *
+   * @param trusted - Whether the model is trusted.
+   *
    * #### Notes
    * The mimeTypes in the model are checked in preference order
    * until a renderer returns `true` for `.canRender`.
    */
-  preferredMimeType(model: IRenderMime.IMimeModel): string {
+  preferredMimeType(model: IRenderMime.IMimeModel, trusted: boolean): string {
     let sanitizer = this.sanitizer;
     return find(this._order, mimeType => {
       if (model.data.has(mimeType)) {
-        let options = { mimeType, sanitizer, trusted: model.trusted };
+        let options = { mimeType, sanitizer, trusted };
         let renderer = this._factories[mimeType];
         let canRender = false;
         try {

+ 8 - 2
packages/rendermime/src/widgets.ts

@@ -96,6 +96,7 @@ abstract class RenderedCommon extends Widget implements IRenderMime.IRendererWid
   /* Construct a new rendered HTML common widget.*/
   constructor(options: IRenderMime.IRendererOptions) {
     super();
+    this.trusted = options.trusted;
     this.mimeType = options.mimeType;
     this.sanitizer = options.sanitizer;
     this.resolver = options.resolver;
@@ -107,6 +108,11 @@ abstract class RenderedCommon extends Widget implements IRenderMime.IRendererWid
    */
   readonly mimeType: string;
 
+  /**
+   * Whether the input is trusted.
+   */
+  readonly trusted: boolean;
+
   /**
    * The sanitizer used to sanitize untrusted html inputs.
    */
@@ -160,7 +166,7 @@ class RenderedHTML extends RenderedHTMLCommon {
    */
   render(model: IRenderMime.IMimeModel): Promise<void> {
     let source = Private.getSource(model, this.mimeType);
-    if (!model.trusted) {
+    if (!this.trusted) {
       source = this.sanitizer.sanitize(source);
     }
     Private.appendHtml(this.node, source);
@@ -218,7 +224,7 @@ class RenderedMarkdown extends RenderedHTMLCommon {
           return;
         }
         content = replaceMath(content, parts['math']);
-        if (!model.trusted) {
+        if (!this.trusted) {
           content = this.sanitizer.sanitize(content);
         }
         Private.appendHtml(this.node, content);

+ 7 - 6
packages/tooltip/src/widget.ts

@@ -26,7 +26,7 @@ import {
 } from '@jupyterlab/apputils';
 
 import {
-  RenderMime, MimeModel
+  IRenderMime, RenderMime, MimeModel
 } from '@jupyterlab/rendermime';
 
 
@@ -75,11 +75,12 @@ class Tooltip extends Widget {
     this._editor = options.editor;
     this._rendermime = options.rendermime;
     let model = new MimeModel({
-      data: options.bundle,
-      trusted: true
+      data: options.bundle
     });
-    this._content = this._rendermime.render(model);
-    if (this._content) {
+    let mimeType = this._rendermime.preferredMimeType(model, true);
+    if (mimeType) {
+      this._content = this._rendermime.createRenderer(mimeType, true);
+      this._content.render(model);
       (this.layout as PanelLayout).addWidget(this._content);
     }
   }
@@ -220,7 +221,7 @@ class Tooltip extends Widget {
     });
   }
 
-  private _content: Widget | null = null;
+  private _content: IRenderMime.IRendererWidget | null = null;
   private _editor: CodeEditor.IEditor;
   private _rendermime: RenderMime;
 }