Recover from failure to render mimetype

martinRenou 5 years ago
parent 8c145adcda
commit 49d1ad98ef

@ -48,7 +48,7 @@ define([
OutputArea.config_defaults = {
stream_chunk_size: 8192, // chunk size for stream output
};
/**
* Class prototypes
**/
@ -79,17 +79,17 @@ define([
if (!this.prompt_area) {
this.prompt_overlay.hide();
}
this.wrapper.addClass('output_wrapper');
this.element.addClass('output');
this.collapse_button.addClass("btn btn-default output_collapsed");
this.collapse_button.attr('title', i18n.msg._('click to expand output'));
this.collapse_button.text('. . .');
this.prompt_overlay.addClass('out_prompt_overlay prompt');
this.prompt_overlay.attr('title', i18n.msg._('click to expand output; double click to hide output'));
this.expand();
};
@ -255,7 +255,7 @@ define([
}
this.append_output(json);
};
// Declare mime type as constants
var MIME_JAVASCRIPT = 'application/javascript';
var MIME_HTML = 'text/html';
@ -267,8 +267,8 @@ define([
var MIME_GIF = 'image/gif';
var MIME_PDF = 'application/pdf';
var MIME_TEXT = 'text/plain';
OutputArea.output_types = [
MIME_JAVASCRIPT,
MIME_HTML,
@ -304,10 +304,10 @@ define([
});
return bundle;
};
OutputArea.prototype.append_output = function (json) {
this.expand();
if (this.clear_queued) {
this.clear_output(false);
this._needs_height_reset = true;
@ -443,7 +443,7 @@ define([
.append($('<div/>').text(err.toString()).addClass('js-error'))
.append($('<div/>').text(i18n.msg._('See your browser Javascript console for more details.')).addClass('js-error'));
};
OutputArea.prototype._safe_append = function (toinsert, toreplace) {
/**
* safely append an item to the document
@ -657,7 +657,7 @@ define([
element: element,
});
};
OutputArea.prototype.append_display_data = function (json, handle_inserted) {
var toinsert = this.create_output_area();
this._record_display_id(json, toinsert);
@ -687,22 +687,28 @@ define([
var md = json.metadata || {};
var value = json.data[type];
var toinsert;
if (!this.trusted && !OutputArea.safe_outputs[type]) {
// not trusted, sanitize HTML
if (type===MIME_HTML || type==='text/svg') {
var parsed = $(security.sanitize_html_and_parse(value));
toinsert = append.apply(this, [parsed, md, element, handle_inserted]);
try {
if (!this.trusted && !OutputArea.safe_outputs[type]) {
// not trusted, sanitize HTML
if (type===MIME_HTML || type==='text/svg') {
var parsed = $(security.sanitize_html_and_parse(value));
toinsert = append.apply(this, [parsed, md, element, handle_inserted]);
} else {
// don't display if we don't know how to sanitize it
console.log("Ignoring untrusted " + type + " output.");
continue;
}
} else {
// don't display if we don't know how to sanitize it
console.log("Ignoring untrusted " + type + " output.");
continue;
toinsert = append.apply(this, [value, md, element, handle_inserted]);
}
} else {
toinsert = append.apply(this, [value, md, element, handle_inserted]);
} catch (e) {
console.error('Failed to render mimetype "' + type + '" with: ', e);
continue;
}
// Since only the png and jpeg mime types call the inserted
// callback, if the mime type is something other we must call the
// callback, if the mime type is something other we must call the
// inserted callback only when the element is actually inserted
// into the DOM. Use a timeout of 0 to do this.
if ([MIME_PNG, MIME_JPEG, MIME_GIF].indexOf(type) < 0 && handle_inserted !== undefined) {
@ -712,6 +718,7 @@ define([
return toinsert;
}
}
return null;
};
@ -783,7 +790,7 @@ define([
var type = MIME_SVG;
var toinsert = this.create_output_subarea(md, "output_svg", type);
// Get the svg element from within the HTML.
// Get the svg element from within the HTML.
// One svg is supposed, but could embed other nested svgs
var svg = $($('<div \>').html(svg_html).find('svg')[0]);
var svg_area = $('<div />');
@ -819,7 +826,7 @@ define([
}
});
}
var set_width_height = function (img, md, mime) {
/**
* set width and height of an img element from metadata
@ -832,7 +839,7 @@ define([
img.addClass('unconfined');
}
};
OutputArea.prototype._append_img = function (src_type, md, element, handle_inserted, MIME, type_string) {
var type = MIME;
var toinsert = this.create_output_subarea(md, 'output_' + type_string, type);
@ -849,7 +856,7 @@ define([
element.append(toinsert);
return toinsert;
};
var append_png = function (png, md, element, handle_inserted) {
return this._append_img(png, md, element, handle_inserted, MIME_PNG, 'png');
};
@ -857,7 +864,7 @@ define([
var append_jpeg = function (jpeg, md, element, handle_inserted) {
return this._append_img(jpeg, md, element, handle_inserted, MIME_JPEG, 'jpeg');
};
var append_gif = function (gif, md, element, handle_inserted) {
return this._append_img(gif, md, element, handle_inserted, MIME_GIF, 'gif');
};
@ -884,18 +891,18 @@ define([
element.append(toinsert);
return toinsert;
};
OutputArea.prototype.append_raw_input = function (msg) {
var that = this;
this.expand();
var content = msg.content;
var area = this.create_output_area();
// disable any other raw_inputs, if they are left around
$("div.output_subarea.raw_input_container").remove();
var input_type = content.password ? 'password' : 'text';
area.append(
$("<div/>")
.addClass("box-flex1 output_subarea raw_input_container")
@ -920,7 +927,7 @@ define([
)
.attr("dir","auto")
);
this.element.append(area);
var raw_input = area.find('input.raw_input');
// Register events that enable/disable the keyboard manager while raw
@ -986,7 +993,7 @@ define([
this.element.height(height);
this.clear_queued = false;
}
// Clear all
// Remove load event handlers from img tags because we don't want
// them to fire if the image is never added to the page.
@ -997,7 +1004,7 @@ define([
// Notify others of changes.
this.element.trigger('changed', {output_area: this});
this.element.trigger('cleared', {output_area: this});
this.outputs = [];
this._display_id_targets = {};
this.trusted = true;
@ -1104,11 +1111,11 @@ define([
OutputArea.append_map[MIME_LATEX] = append_latex;
OutputArea.append_map[MIME_JAVASCRIPT] = append_javascript;
OutputArea.append_map[MIME_PDF] = append_pdf;
OutputArea.prototype.mime_types = function () {
return OutputArea.display_order;
};
OutputArea.prototype.register_mime_type = function (mimetype, append, options) {
if (mimetype && typeof(append) === 'function') {
OutputArea.output_types.push(mimetype);

Loading…
Cancel
Save