mirror of
https://github.com/jupyter/notebook.git
synced 2025-03-07 13:07:22 +08:00
Merge pull request #4565 from minrk/format_check
various display type validations to protect notebooks from invalid display data, and add informative errors for invalid data.
This commit is contained in:
commit
9db5a0d1e4
@ -276,7 +276,7 @@ var IPython = (function (IPython) {
|
||||
"json" : "application/json",
|
||||
"javascript" : "application/javascript",
|
||||
};
|
||||
|
||||
|
||||
OutputArea.prototype.rename_keys = function (data, key_map) {
|
||||
var remapped = {};
|
||||
for (var key in data) {
|
||||
@ -285,7 +285,30 @@ var IPython = (function (IPython) {
|
||||
}
|
||||
return remapped;
|
||||
};
|
||||
|
||||
|
||||
|
||||
OutputArea.output_types = [
|
||||
'application/javascript',
|
||||
'text/html',
|
||||
'text/latex',
|
||||
'image/svg+xml',
|
||||
'image/png',
|
||||
'image/jpeg',
|
||||
'text/plain'
|
||||
];
|
||||
|
||||
OutputArea.prototype.validate_output = function (json) {
|
||||
// scrub invalid outputs
|
||||
// TODO: right now everything is a string, but JSON really shouldn't be.
|
||||
// nbformat 4 will fix that.
|
||||
$.map(OutputArea.output_types, function(key){
|
||||
if (json[key] !== undefined && typeof json[key] !== 'string') {
|
||||
console.log("Invalid type for " + key, json[key]);
|
||||
delete json[key];
|
||||
}
|
||||
});
|
||||
return json;
|
||||
};
|
||||
|
||||
OutputArea.prototype.append_output = function (json) {
|
||||
this.expand();
|
||||
@ -295,6 +318,9 @@ var IPython = (function (IPython) {
|
||||
this.clear_output(false);
|
||||
needs_height_reset = true;
|
||||
}
|
||||
|
||||
// validate output data types
|
||||
json = this.validate_output(json);
|
||||
|
||||
if (json.output_type === 'pyout') {
|
||||
this.append_pyout(json);
|
||||
|
@ -15,8 +15,8 @@ mime = {
|
||||
"javascript" : "application/javascript",
|
||||
};
|
||||
|
||||
var black_dot_jpeg="\"\"\"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDACodICUgGiolIiUvLSoyP2lEPzo6P4FcYUxpmYagnpaG\nk5GovfLNqLPltZGT0v/V5fr/////o8v///////L/////2wBDAS0vLz83P3xERHz/rpOu////////\n////////////////////////////////////////////////////////////wgARCAABAAEDAREA\nAhEBAxEB/8QAFAABAAAAAAAAAAAAAAAAAAAABP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEA\nAhADEAAAARn/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAA\nAAAAAAAA/9oACAEDAQE/AX//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAECAQE/AX//xAAUEAEA\nAAAAAAAAAAAAAAAAAAAA/9oACAEBAAY/An//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/\nIX//2gAMAwEAAgADAAAAEB//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAEDAQE/EH//xAAUEQEA\nAAAAAAAAAAAAAAAAAAAA/9oACAECAQE/EH//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/\nEH//2Q==\"\"\"";
|
||||
var black_dot_png = '\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAWJLR0QA\\niAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94BCRQnOqNu0b4AAAAKSURBVAjXY2AA\\nAAACAAHiIbwzAAAAAElFTkSuQmCC\"';
|
||||
var black_dot_jpeg="u\"\"\"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDACodICUgGiolIiUvLSoyP2lEPzo6P4FcYUxpmYagnpaG\nk5GovfLNqLPltZGT0v/V5fr/////o8v///////L/////2wBDAS0vLz83P3xERHz/rpOu////////\n////////////////////////////////////////////////////////////wgARCAABAAEDAREA\nAhEBAxEB/8QAFAABAAAAAAAAAAAAAAAAAAAABP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEA\nAhADEAAAARn/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAA\nAAAAAAAA/9oACAEDAQE/AX//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAECAQE/AX//xAAUEAEA\nAAAAAAAAAAAAAAAAAAAA/9oACAEBAAY/An//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/\nIX//2gAMAwEAAgADAAAAEB//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAEDAQE/EH//xAAUEQEA\nAAAAAAAAAAAAAAAAAAAA/9oACAECAQE/EH//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/\nEH//2Q==\"\"\"";
|
||||
var black_dot_png = 'u\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAWJLR0QA\\niAUdSAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94BCRQnOqNu0b4AAAAKSURBVAjXY2AA\\nAAACAAHiIbwzAAAAAElFTkSuQmCC\"';
|
||||
var svg = "\"<svg width='1cm' height='1cm' viewBox='0 0 1000 500'><defs><style>rect {fill:red;}; </style></defs><rect id='r1' x='200' y='100' width='600' height='300' /></svg>\"";
|
||||
|
||||
// helper function to ensure that the short_name is found in the toJSON
|
||||
|
32
IPython/html/tests/casperjs/test_cases/safe_append_output.js
Normal file
32
IPython/html/tests/casperjs/test_cases/safe_append_output.js
Normal file
@ -0,0 +1,32 @@
|
||||
//
|
||||
// Test validation in append_output
|
||||
//
|
||||
// Invalid output data is stripped and logged.
|
||||
//
|
||||
|
||||
casper.notebook_test(function () {
|
||||
// this.printLog();
|
||||
var messages = [];
|
||||
this.on('remote.message', function (msg) {
|
||||
messages.push(msg);
|
||||
});
|
||||
|
||||
this.evaluate(function () {
|
||||
var cell = IPython.notebook.get_cell(0);
|
||||
cell.set_text( "dp = get_ipython().display_pub\n" +
|
||||
"dp.publish('test', {'text/plain' : '5', 'image/png' : 5})"
|
||||
);
|
||||
cell.execute();
|
||||
});
|
||||
|
||||
this.wait_for_output(0);
|
||||
this.on('remote.message', function () {});
|
||||
|
||||
this.then(function () {
|
||||
var output = this.get_output_cell(0);
|
||||
this.test.assert(messages.length > 0, "Captured log message");
|
||||
this.test.assertEquals(messages[messages.length-1], "Invalid type for image/png 5", "Logged Invalid type message");
|
||||
this.test.assertEquals(output['image/png'], undefined, "Non-string png data was stripped");
|
||||
this.test.assertEquals(output['text/plain'], '5', "text data is fine");
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user