index.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
  4. import { RenderedJavaScript } from '@jupyterlab/rendermime';
  5. export const TEXT_JAVASCRIPT_MIMETYPE = 'text/javascript';
  6. export const APPLICATION_JAVASCRIPT_MIMETYPE = 'application/javascript';
  7. function evalInContext(
  8. code: string,
  9. element: Element,
  10. document: Document,
  11. window: Window
  12. ) {
  13. // eslint-disable-next-line
  14. return eval(code);
  15. }
  16. export class ExperimentalRenderedJavascript extends RenderedJavaScript {
  17. render(model: IRenderMime.IMimeModel): Promise<void> {
  18. const trans = this.translator.load('jupyterlab');
  19. const renderJavascript = () => {
  20. try {
  21. const data = model.data[this.mimeType] as string | undefined;
  22. if (data) {
  23. evalInContext(data, this.node, document, window);
  24. }
  25. return Promise.resolve();
  26. } catch (error) {
  27. return Promise.reject(error);
  28. }
  29. };
  30. if (!model.trusted) {
  31. // If output is not trusted or if arbitrary Javascript execution is not enabled, render an informative error message
  32. const pre = document.createElement('pre');
  33. pre.textContent = trans.__(
  34. 'Are you sure that you want to run arbitrary Javascript within your JupyterLab session?'
  35. );
  36. const button = document.createElement('button');
  37. button.textContent = trans.__('Run');
  38. this.node.appendChild(pre);
  39. this.node.appendChild(button);
  40. button.onclick = event => {
  41. this.node.textContent = '';
  42. void renderJavascript();
  43. };
  44. return Promise.resolve();
  45. }
  46. return renderJavascript();
  47. }
  48. }
  49. /**
  50. * A mime renderer factory for text/javascript data.
  51. */
  52. export const rendererFactory: IRenderMime.IRendererFactory = {
  53. safe: false,
  54. mimeTypes: [TEXT_JAVASCRIPT_MIMETYPE, APPLICATION_JAVASCRIPT_MIMETYPE],
  55. createRenderer: options => new ExperimentalRenderedJavascript(options)
  56. };
  57. const extension: IRenderMime.IExtension = {
  58. id: '@jupyterlab/javascript-extension:factory',
  59. rendererFactory,
  60. rank: 0,
  61. dataType: 'string'
  62. };
  63. export default extension;