Show More
@@ -0,0 +1,42 b'' | |||||
|
1 | // | |||
|
2 | // Test svg isolation | |||
|
3 | // An object whose metadata contains an "isolated" tag must be isolated | |||
|
4 | // from the rest of the document. In the case of inline SVGs, this means | |||
|
5 | // that multiple SVGs have different scopes. This test checks that there | |||
|
6 | // are no CSS leaks between two isolated SVGs. | |||
|
7 | // | |||
|
8 | ||||
|
9 | casper.notebook_test(function () { | |||
|
10 | this.evaluate(function () { | |||
|
11 | var cell = IPython.notebook.get_cell(0); | |||
|
12 | cell.set_text( "from IPython.core.display import SVG, display_svg\n" | |||
|
13 | + "s1 = '''<svg width='1cm' height='1cm' viewBox='0 0 1000 500'>" | |||
|
14 | + "<defs><style>rect {fill:red;}; </style></defs>" | |||
|
15 | + "<rect id='r1' x='200' y='100' width='600' height='300' /></svg>" | |||
|
16 | + "'''\n" | |||
|
17 | + "s2 = '''<svg width='1cm' height='1cm' viewBox='0 0 1000 500'>" | |||
|
18 | + "<rect id='r2' x='200' y='100' width='600' height='300' /></svg>" | |||
|
19 | + "'''\n" | |||
|
20 | + "display_svg(SVG(s1), metadata=dict(isolated=True))\n" | |||
|
21 | + "display_svg(SVG(s2), metadata=dict(isolated=True))\n" | |||
|
22 | ); | |||
|
23 | cell.execute(); | |||
|
24 | }); | |||
|
25 | ||||
|
26 | this.wait_for_output(0); | |||
|
27 | ||||
|
28 | this.then(function () { | |||
|
29 | var colors = this.evaluate(function () { | |||
|
30 | var colors = []; | |||
|
31 | var ifr = __utils__.findAll("iframe"); | |||
|
32 | var svg1 = ifr[0].contentWindow.document.getElementById('r1'); | |||
|
33 | colors[0] = window.getComputedStyle(svg1)["fill"]; | |||
|
34 | var svg2 = ifr[1].contentWindow.document.getElementById('r2'); | |||
|
35 | colors[1] = window.getComputedStyle(svg2)["fill"]; | |||
|
36 | return colors; | |||
|
37 | }); | |||
|
38 | ||||
|
39 | this.test.assertEquals(colors[0], '#ff0000', 'First svg should be red'); | |||
|
40 | this.test.assertEquals(colors[1], '#000000', 'Second svg should be black'); | |||
|
41 | }); | |||
|
42 | }); |
@@ -326,7 +326,51 b' var IPython = (function (IPython) {' | |||||
326 | } |
|
326 | } | |
327 | return oa; |
|
327 | return oa; | |
328 | }; |
|
328 | }; | |
329 |
|
329 | |||
|
330 | ||||
|
331 | OutputArea.prototype.create_output_subarea = function(md, classes) { | |||
|
332 | var subarea = $('<div/>').addClass('output_subarea').addClass(classes); | |||
|
333 | if (md['isolated']) { | |||
|
334 | // Create an iframe to isolate the subarea from the rest of the | |||
|
335 | // document | |||
|
336 | var iframe = $('<iframe/>').addClass('box-flex1'); | |||
|
337 | iframe.css({'height':1, 'width':'100%', 'display':'block'}); | |||
|
338 | iframe.attr('frameborder', 0); | |||
|
339 | iframe.attr('scrolling', 'auto'); | |||
|
340 | ||||
|
341 | // Once the iframe is loaded, the subarea is dynamically inserted | |||
|
342 | iframe.on('load', function() { | |||
|
343 | // Workaround needed by Firefox, to properly render svg inside | |||
|
344 | // iframes, see http://stackoverflow.com/questions/10177190/ | |||
|
345 | // svg-dynamically-added-to-iframe-does-not-render-correctly | |||
|
346 | this.contentDocument.open(); | |||
|
347 | ||||
|
348 | // Insert the subarea into the iframe | |||
|
349 | // We must directly write the html. When using Jquery's append | |||
|
350 | // method, javascript is evaluated in the parent document and | |||
|
351 | // not in the iframe document. | |||
|
352 | this.contentDocument.write(subarea.html()); | |||
|
353 | ||||
|
354 | this.contentDocument.close(); | |||
|
355 | ||||
|
356 | var body = this.contentDocument.body; | |||
|
357 | // Adjust the iframe height automatically | |||
|
358 | iframe.height(body.scrollHeight + 'px'); | |||
|
359 | }); | |||
|
360 | ||||
|
361 | // Elements should be appended to the inner subarea and not to the | |||
|
362 | // iframe | |||
|
363 | iframe.append = function(that) { | |||
|
364 | subarea.append(that); | |||
|
365 | }; | |||
|
366 | ||||
|
367 | return iframe; | |||
|
368 | } else { | |||
|
369 | return subarea; | |||
|
370 | } | |||
|
371 | } | |||
|
372 | ||||
|
373 | ||||
330 | OutputArea.prototype._append_javascript_error = function (err, container) { |
|
374 | OutputArea.prototype._append_javascript_error = function (err, container) { | |
331 | // display a message when a javascript error occurs in display output |
|
375 | // display a message when a javascript error occurs in display output | |
332 | var msg = "Javascript error adding output!" |
|
376 | var msg = "Javascript error adding output!" | |
@@ -460,7 +504,7 b' var IPython = (function (IPython) {' | |||||
460 |
|
504 | |||
461 |
|
505 | |||
462 | OutputArea.prototype.append_html = function (html, md, element) { |
|
506 | OutputArea.prototype.append_html = function (html, md, element) { | |
463 |
var toinsert = |
|
507 | var toinsert = this.create_output_subarea(md, "output_html rendered_html"); | |
464 | toinsert.append(html); |
|
508 | toinsert.append(html); | |
465 | element.append(toinsert); |
|
509 | element.append(toinsert); | |
466 | }; |
|
510 | }; | |
@@ -468,7 +512,7 b' var IPython = (function (IPython) {' | |||||
468 |
|
512 | |||
469 | OutputArea.prototype.append_javascript = function (js, md, container) { |
|
513 | OutputArea.prototype.append_javascript = function (js, md, container) { | |
470 | // We just eval the JS code, element appears in the local scope. |
|
514 | // We just eval the JS code, element appears in the local scope. | |
471 |
var element = |
|
515 | var element = this.create_output_subarea(md, ""); | |
472 | container.append(element); |
|
516 | container.append(element); | |
473 | // Div for js shouldn't be drawn, as it will add empty height to the area. |
|
517 | // Div for js shouldn't be drawn, as it will add empty height to the area. | |
474 | container.hide(); |
|
518 | container.hide(); | |
@@ -483,7 +527,7 b' var IPython = (function (IPython) {' | |||||
483 |
|
527 | |||
484 |
|
528 | |||
485 | OutputArea.prototype.append_text = function (data, md, element, extra_class) { |
|
529 | OutputArea.prototype.append_text = function (data, md, element, extra_class) { | |
486 |
var toinsert = |
|
530 | var toinsert = this.create_output_subarea(md, "output_text"); | |
487 | // escape ANSI & HTML specials in plaintext: |
|
531 | // escape ANSI & HTML specials in plaintext: | |
488 | data = utils.fixConsole(data); |
|
532 | data = utils.fixConsole(data); | |
489 | data = utils.fixCarriageReturn(data); |
|
533 | data = utils.fixCarriageReturn(data); | |
@@ -497,7 +541,7 b' var IPython = (function (IPython) {' | |||||
497 |
|
541 | |||
498 |
|
542 | |||
499 | OutputArea.prototype.append_svg = function (svg, md, element) { |
|
543 | OutputArea.prototype.append_svg = function (svg, md, element) { | |
500 |
var toinsert = |
|
544 | var toinsert = this.create_output_subarea(md, "output_svg"); | |
501 | toinsert.append(svg); |
|
545 | toinsert.append(svg); | |
502 | element.append(toinsert); |
|
546 | element.append(toinsert); | |
503 | }; |
|
547 | }; | |
@@ -531,7 +575,7 b' var IPython = (function (IPython) {' | |||||
531 |
|
575 | |||
532 |
|
576 | |||
533 | OutputArea.prototype.append_png = function (png, md, element) { |
|
577 | OutputArea.prototype.append_png = function (png, md, element) { | |
534 |
var toinsert = |
|
578 | var toinsert = this.create_output_subarea(md, "output_png"); | |
535 | var img = $("<img/>").attr('src','data:image/png;base64,'+png); |
|
579 | var img = $("<img/>").attr('src','data:image/png;base64,'+png); | |
536 | if (md['height']) { |
|
580 | if (md['height']) { | |
537 | img.attr('height', md['height']); |
|
581 | img.attr('height', md['height']); | |
@@ -546,7 +590,7 b' var IPython = (function (IPython) {' | |||||
546 |
|
590 | |||
547 |
|
591 | |||
548 | OutputArea.prototype.append_jpeg = function (jpeg, md, element) { |
|
592 | OutputArea.prototype.append_jpeg = function (jpeg, md, element) { | |
549 |
var toinsert = |
|
593 | var toinsert = this.create_output_subarea(md, "output_jpeg"); | |
550 | var img = $("<img/>").attr('src','data:image/jpeg;base64,'+jpeg); |
|
594 | var img = $("<img/>").attr('src','data:image/jpeg;base64,'+jpeg); | |
551 | if (md['height']) { |
|
595 | if (md['height']) { | |
552 | img.attr('height', md['height']); |
|
596 | img.attr('height', md['height']); | |
@@ -563,7 +607,7 b' var IPython = (function (IPython) {' | |||||
563 | OutputArea.prototype.append_latex = function (latex, md, element) { |
|
607 | OutputArea.prototype.append_latex = function (latex, md, element) { | |
564 | // This method cannot do the typesetting because the latex first has to |
|
608 | // This method cannot do the typesetting because the latex first has to | |
565 | // be on the page. |
|
609 | // be on the page. | |
566 |
var toinsert = |
|
610 | var toinsert = this.create_output_subarea(md, "output_latex"); | |
567 | toinsert.append(latex); |
|
611 | toinsert.append(latex); | |
568 | element.append(toinsert); |
|
612 | element.append(toinsert); | |
569 | }; |
|
613 | }; |
General Comments 0
You need to be logged in to leave comments.
Login now