|
@@ -8,6 +8,13 @@ import {
|
|
SVGRenderer, MarkdownRenderer, TextRenderer, HTMLRenderer, ImageRenderer
|
|
SVGRenderer, MarkdownRenderer, TextRenderer, HTMLRenderer, ImageRenderer
|
|
} from '../../../lib/renderers';
|
|
} from '../../../lib/renderers';
|
|
|
|
|
|
|
|
+import {
|
|
|
|
+ defaultSanitizer
|
|
|
|
+} from '../../../lib/sanitizer';
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+const EXPECTED_MD = `<h1>Title first level</h1>\n<h2>Title second Level</h2>\n<h3>Title third level</h3>\n<h4>h4</h4>\n<h5>h5</h5>\n<h6>h6</h6>\n<h1>h1</h1>\n<h2>h2</h2>\n<h3>h3</h3>\n<h4>h4</h4>\n<h5>h6</h5>\n<p>This is just a sample paragraph<br>You can look at different level of nested unorderd list ljbakjn arsvlasc asc asc awsc asc ascd ascd ascd asdc asc</p>\n<ul>\n<li>level 1<ul>\n<li>level 2</li>\n<li>level 2</li>\n<li>level 2<ul>\n<li>level 3</li>\n<li>level 3<ul>\n<li>level 4<ul>\n<li>level 5<ul>\n<li>level 6</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>level 2</li>\n</ul>\n</li>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1<br>Ordered list</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n</li>\n<li>level 1</li>\n<li>level 1<br>some Horizontal line</li>\n</ul>\n<hr>\n<h2>and another one</h2>\n<p>Colons can be used to align columns.</p>\n<table>\n<thead>\n<tr>\n<th>Tables</th>\n<th>Are</th>\n<th>Cool</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>col 3 is</td>\n<td>right-aligned</td>\n<td>1600</td>\n</tr>\n<tr>\n<td>col 2 is</td>\n<td>centered</td>\n<td>12</td>\n</tr>\n<tr>\n<td>zebra stripes</td>\n<td>are neat</td>\n<td>1</td>\n</tr>\n</tbody>\n</table>\n<p>There must be at least 3 dashes separating each header cell.<br>The outer pipes (|) are optional, and you don\'t need to make the<br>raw Markdown line up prettily. You can also use inline Markdown.</p>\n`;
|
|
|
|
+
|
|
|
|
|
|
describe('renderers', () => {
|
|
describe('renderers', () => {
|
|
|
|
|
|
@@ -43,37 +50,30 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
|
|
+ describe('#render()', () => {
|
|
|
|
|
|
it('should output the correct HTML', () => {
|
|
it('should output the correct HTML', () => {
|
|
let t = new TextRenderer();
|
|
let t = new TextRenderer();
|
|
- let text = t.transform('text/plain', 'x = 2 ** a');
|
|
|
|
- expect(text).to.be('<pre>x = 2 ** a</pre>');
|
|
|
|
|
|
+ let widget = t.render({ mimetype: 'text/plain', source: 'x = 2 ** a' });
|
|
|
|
+ expect(widget.node.innerHTML).to.be('<pre>x = 2 ** a</pre>');
|
|
});
|
|
});
|
|
|
|
|
|
it('should output the correct HTML with ansi colors', () => {
|
|
it('should output the correct HTML with ansi colors', () => {
|
|
let t = new TextRenderer();
|
|
let t = new TextRenderer();
|
|
- let text = 'There is no text but \x1b[01;41;32mtext\x1b[00m.\nWoo.';
|
|
|
|
- text = t.transform('application/vnd.jupyter.console-text', text);
|
|
|
|
- expect(text).to.be('<pre>There is no text but <span style="color:rgb(0, 255, 0);background-color:rgb(187, 0, 0)">text</span>.\nWoo.</pre>');
|
|
|
|
|
|
+ let source = 'There is no text but \x1b[01;41;32mtext\x1b[00m.\nWoo.';
|
|
|
|
+ let widget = t.render({
|
|
|
|
+ mimetype: 'application/vnd.jupyter.console-text', source
|
|
|
|
+ });
|
|
|
|
+ expect(widget.node.innerHTML).to.be('<pre>There is no text but <span style="color:rgb(0, 255, 0);background-color:rgb(187, 0, 0)">text</span>.\nWoo.</pre>');
|
|
});
|
|
});
|
|
|
|
|
|
it('should escape inline html', () => {
|
|
it('should escape inline html', () => {
|
|
let t = new TextRenderer();
|
|
let t = new TextRenderer();
|
|
- let text = 'There is no text <script>window.x=1</script> but \x1b[01;41;32mtext\x1b[00m.\nWoo.';
|
|
|
|
- text = t.transform('application/vnd.jupyter.console-text', text);
|
|
|
|
- expect(text).to.be('<pre>There is no text <script>window.x=1</script> but <span style="color:rgb(0, 255, 0);background-color:rgb(187, 0, 0)">text</span>.\nWoo.</pre>');
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- describe('#render()', () => {
|
|
|
|
-
|
|
|
|
- it('should set the inner html of the widget', () => {
|
|
|
|
- let t = new TextRenderer();
|
|
|
|
- let html = '<pre>Hello</pre>';
|
|
|
|
- let widget = t.render('text/plain', html);
|
|
|
|
- expect(widget.node.innerHTML).to.be(html);
|
|
|
|
|
|
+ let source = 'There is no text <script>window.x=1</script> but \x1b[01;41;32mtext\x1b[00m.\nWoo.';
|
|
|
|
+ let widget = t.render({
|
|
|
|
+ mimetype: 'application/vnd.jupyter.console-text', source
|
|
|
|
+ });
|
|
|
|
+ expect(widget.node.innerHTML).to.be('<pre>There is no text <script>window.x=1</script> but <span style="color:rgb(0, 255, 0);background-color:rgb(187, 0, 0)">text</span>.\nWoo.</pre>');
|
|
});
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
@@ -109,24 +109,13 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- let mathJaxScript = '<script type="math/tex">\sum\limits_{i=0}^{\infty} \frac{1}{n^2}</script>';
|
|
|
|
- let t = new LatexRenderer();
|
|
|
|
- let text = t.transform('text/latex', mathJaxScript);
|
|
|
|
- expect(text).to.be(mathJaxScript);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should set the textContent of the widget', () => {
|
|
it('should set the textContent of the widget', () => {
|
|
- let mathJaxScript = '\sum\limits_{i=0}^{\infty} \frac{1}{n^2}';
|
|
|
|
|
|
+ let source = '\sum\limits_{i=0}^{\infty} \frac{1}{n^2}';
|
|
let t = new LatexRenderer();
|
|
let t = new LatexRenderer();
|
|
- let widget = t.render('text/latex', mathJaxScript);
|
|
|
|
- expect(widget.node.textContent).to.be(mathJaxScript);
|
|
|
|
|
|
+ let widget = t.render({ mimetype: 'text/latex', source });
|
|
|
|
+ expect(widget.node.textContent).to.be(source);
|
|
});
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
@@ -162,23 +151,12 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- let base64PDF = "I don't have a b64'd PDF";
|
|
|
|
- let t = new PDFRenderer();
|
|
|
|
- let text = t.transform('application/pdf', base64PDF);
|
|
|
|
- expect(text).to.be(base64PDF);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should render the correct HTML', () => {
|
|
it('should render the correct HTML', () => {
|
|
- let base64PDF = "I don't have a b64'd PDF";
|
|
|
|
|
|
+ let source = "I don't have a b64'd PDF";
|
|
let t = new PDFRenderer();
|
|
let t = new PDFRenderer();
|
|
- let w = t.render('application/pdf', base64PDF);
|
|
|
|
|
|
+ let w = t.render({ mimetype: 'application/pdf', source });
|
|
expect(w.node.innerHTML.indexOf('data:application/pdf')).to.not.be(-1);
|
|
expect(w.node.innerHTML.indexOf('data:application/pdf')).to.not.be(-1);
|
|
});
|
|
});
|
|
|
|
|
|
@@ -216,24 +194,15 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- let t = new PDFRenderer();
|
|
|
|
- let text = t.transform('text/javascript', 'window.x = 1');
|
|
|
|
- expect(text).to.be('window.x = 1');
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should create a script tag', () => {
|
|
it('should create a script tag', () => {
|
|
let t = new JavascriptRenderer();
|
|
let t = new JavascriptRenderer();
|
|
- let w = t.render('text/javascript', 'window.x = 1');
|
|
|
|
|
|
+ let source = 'window.x = 1';
|
|
|
|
+ let w = t.render({ mimetype: 'text/javascript', source });
|
|
let el = w.node.firstChild as HTMLElement;
|
|
let el = w.node.firstChild as HTMLElement;
|
|
expect(el.localName).to.be('script');
|
|
expect(el.localName).to.be('script');
|
|
- expect(el.textContent).to.be('window.x = 1');
|
|
|
|
|
|
+ expect(el.textContent).to.be(source);
|
|
|
|
|
|
// Ensure script has not been run yet
|
|
// Ensure script has not been run yet
|
|
expect((window as any).x).to.be(void 0);
|
|
expect((window as any).x).to.be(void 0);
|
|
@@ -277,36 +246,25 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- const svg = `
|
|
|
|
- <?xml version="1.0" standalone="no"?>
|
|
|
|
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
|
|
- SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
|
|
- <svg></svg>`;
|
|
|
|
- let t = new SVGRenderer();
|
|
|
|
- let text = t.transform('image/svg+xml', svg);
|
|
|
|
- expect(text).to.be(svg);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should create an svg tag', () => {
|
|
it('should create an svg tag', () => {
|
|
- const svg = `
|
|
|
|
- <?xml version="1.0" standalone="no"?>
|
|
|
|
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
|
|
- SYSTEM "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
|
|
- <svg></svg>
|
|
|
|
- `;
|
|
|
|
|
|
+ const source = '<svg></svg>';
|
|
let t = new SVGRenderer();
|
|
let t = new SVGRenderer();
|
|
- let w = t.render('image/svg+xml', svg);
|
|
|
|
|
|
+ let w = t.render({ mimetype: 'image/svg+xml', source });
|
|
let svgEl = w.node.getElementsByTagName('svg')[0];
|
|
let svgEl = w.node.getElementsByTagName('svg')[0];
|
|
expect(svgEl).to.be.ok();
|
|
expect(svgEl).to.be.ok();
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ it('should sanitize when a sanitizer is given', () => {
|
|
|
|
+ const source = '<svg><script>window.x = 1</script></svg>';
|
|
|
|
+ let t = new SVGRenderer();
|
|
|
|
+ let w = t.render({
|
|
|
|
+ mimetype: 'image/svg+xml', source, sanitizer: defaultSanitizer
|
|
|
|
+ });
|
|
|
|
+ expect(w.node.innerHTML).to.be('<svg></svg>');
|
|
|
|
+ });
|
|
|
|
+
|
|
});
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
@@ -340,25 +298,38 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should create nice markup', (done) => {
|
|
|
|
- let md = require('../../../examples/filebrowser/sample.md');
|
|
|
|
- let t = new MarkdownRenderer();
|
|
|
|
- t.transform('text/markdown', md as string).then(text => {
|
|
|
|
- expect(text).to.be(`<h1 id="title-first-level">Title first level</h1>\n<h2 id="title-second-level">Title second Level</h2>\n<h3 id="title-third-level">Title third level</h3>\n<h4 id="h4">h4</h4>\n<h5 id="h5">h5</h5>\n<h6 id="h6">h6</h6>\n<h1 id="h1">h1</h1>\n<h2 id="h2">h2</h2>\n<h3 id="h3">h3</h3>\n<h4 id="h4">h4</h4>\n<h5 id="h6">h6</h5>\n<p>This is just a sample paragraph<br>You can look at different level of nested unorderd list ljbakjn arsvlasc asc asc awsc asc ascd ascd ascd asdc asc</p>\n<ul>\n<li>level 1<ul>\n<li>level 2</li>\n<li>level 2</li>\n<li>level 2<ul>\n<li>level 3</li>\n<li>level 3<ul>\n<li>level 4<ul>\n<li>level 5<ul>\n<li>level 6</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>level 2</li>\n</ul>\n</li>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1<br>Ordered list</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1<ol>\n<li>level 1</li>\n<li>level 1</li>\n<li>level 1</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n</li>\n</ol>\n</li>\n<li>level 1</li>\n<li>level 1<br>some Horizontal line</li>\n</ul>\n<hr>\n<h2 id="and-another-one">and another one</h2>\n<p>Colons can be used to align columns.</p>\n<table>\n<thead>\n<tr>\n<th>Tables</th>\n<th style="text-align:center">Are</th>\n<th style="text-align:right">Cool</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>col 3 is</td>\n<td style="text-align:center">right-aligned</td>\n<td style="text-align:right">1600</td>\n</tr>\n<tr>\n<td>col 2 is</td>\n<td style="text-align:center">centered</td>\n<td style="text-align:right">12</td>\n</tr>\n<tr>\n<td>zebra stripes</td>\n<td style="text-align:center">are neat</td>\n<td style="text-align:right">1</td>\n</tr>\n</tbody>\n</table>\n<p>There must be at least 3 dashes separating each header cell.<br>The outer pipes (|) are optional, and you don't need to make the<br>raw Markdown line up prettily. You can also use inline Markdown.</p>\n`);
|
|
|
|
- }).then(done, done);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
- it('should set the inner html', () => {
|
|
|
|
|
|
+ it('should set the inner html', (done) => {
|
|
let t = new MarkdownRenderer();
|
|
let t = new MarkdownRenderer();
|
|
- let html = '<p>hello</p>';
|
|
|
|
- let w = t.render('text/markdown', html);
|
|
|
|
- expect(w.node.innerHTML).to.be(html);
|
|
|
|
|
|
+ let source = '<p>hello</p>';
|
|
|
|
+ let widget = t.render({ mimetype: 'text/markdown', source });
|
|
|
|
+ let loop = () => {
|
|
|
|
+ if ((widget as any)._rendered) {
|
|
|
|
+ expect(widget.node.innerHTML).to.be(source);
|
|
|
|
+ done();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ setTimeout(loop, 100);
|
|
|
|
+ };
|
|
|
|
+ setTimeout(loop, 100);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ it('should sanitize if a sanitizer is given', (done) => {
|
|
|
|
+ let source = require('../../../examples/filebrowser/sample.md') as string;
|
|
|
|
+ let r = new MarkdownRenderer();
|
|
|
|
+ let widget = r.render({
|
|
|
|
+ mimetype: 'text/markdown', source, sanitizer: defaultSanitizer
|
|
|
|
+ });
|
|
|
|
+ let loop = () => {
|
|
|
|
+ if ((widget as any)._rendered) {
|
|
|
|
+ expect(widget.node.innerHTML).to.be(EXPECTED_MD);
|
|
|
|
+ done();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ setTimeout(loop, 100);
|
|
|
|
+ };
|
|
|
|
+ setTimeout(loop, 100);
|
|
});
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
@@ -394,36 +365,34 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- let t = new HTMLRenderer();
|
|
|
|
- const htmlText = '<h1>This is great</h1>';
|
|
|
|
- let text = t.transform('text/html', htmlText);
|
|
|
|
- expect(text).to.be(htmlText);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should set the inner HTML', () => {
|
|
it('should set the inner HTML', () => {
|
|
let t = new HTMLRenderer();
|
|
let t = new HTMLRenderer();
|
|
- const htmlText = '<h1>This is great</h1>';
|
|
|
|
- let w = t.render('text/html', htmlText);
|
|
|
|
|
|
+ const source = '<h1>This is great</h1>';
|
|
|
|
+ let w = t.render({ mimetype: 'text/html', source });
|
|
expect(w.node.innerHTML).to.be('<h1>This is great</h1>');
|
|
expect(w.node.innerHTML).to.be('<h1>This is great</h1>');
|
|
});
|
|
});
|
|
|
|
|
|
it('should execute a script tag when attached', () => {
|
|
it('should execute a script tag when attached', () => {
|
|
- const htmlText = '<script>window.y=3;</script>';
|
|
|
|
|
|
+ const source = '<script>window.y=3;</script>';
|
|
let t = new HTMLRenderer();
|
|
let t = new HTMLRenderer();
|
|
- let w = t.render('text/html', htmlText);
|
|
|
|
|
|
+ let w = t.render({ mimetype: 'text/html', source });
|
|
expect((window as any).y).to.be(void 0);
|
|
expect((window as any).y).to.be(void 0);
|
|
w.attach(document.body);
|
|
w.attach(document.body);
|
|
expect((window as any).y).to.be(3);
|
|
expect((window as any).y).to.be(3);
|
|
w.dispose();
|
|
w.dispose();
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ it('should sanitize when a sanitizer is given', () => {
|
|
|
|
+ const source = '<pre><script>window.y=3;</script></pre>';
|
|
|
|
+ let t = new HTMLRenderer();
|
|
|
|
+ let w = t.render({
|
|
|
|
+ mimetype: 'text/html', source, sanitizer: defaultSanitizer
|
|
|
|
+ });
|
|
|
|
+ expect(w.node.innerHTML).to.be('<pre></pre>');
|
|
|
|
+ });
|
|
|
|
+
|
|
});
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
@@ -457,32 +426,21 @@ describe('renderers', () => {
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
- describe('#transform()', () => {
|
|
|
|
-
|
|
|
|
- it('should be a no-op', () => {
|
|
|
|
- let t = new ImageRenderer();
|
|
|
|
- const imageData = 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
|
|
|
- let text = t.transform('image/png', imageData);
|
|
|
|
- expect(text).to.be(imageData);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
describe('#render()', () => {
|
|
describe('#render()', () => {
|
|
|
|
|
|
it('should create an <img> with the right mimetype', () => {
|
|
it('should create an <img> with the right mimetype', () => {
|
|
- const imageData = 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
|
|
|
|
|
+ let source = 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
|
let t = new ImageRenderer();
|
|
let t = new ImageRenderer();
|
|
- let w = t.render('image/png', imageData);
|
|
|
|
|
|
+ let w = t.render({ mimetype: 'image/png', source });
|
|
let el = w.node.firstChild as HTMLImageElement;
|
|
let el = w.node.firstChild as HTMLImageElement;
|
|
- expect(el.src).to.be('data:image/png;base64,' + imageData);
|
|
|
|
|
|
+ expect(el.src).to.be('data:image/png;base64,' + source);
|
|
expect(el.localName).to.be('img');
|
|
expect(el.localName).to.be('img');
|
|
expect(el.innerHTML).to.be('');
|
|
expect(el.innerHTML).to.be('');
|
|
|
|
|
|
- const imageData2 = 'R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=';
|
|
|
|
- w = t.render('image/gif', imageData2);
|
|
|
|
|
|
+ source = 'R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=';
|
|
|
|
+ w = t.render({ mimetype: 'image/gif', source });
|
|
el = w.node.firstChild as HTMLImageElement;
|
|
el = w.node.firstChild as HTMLImageElement;
|
|
- expect(el.src).to.be('data:image/gif;base64,' + imageData2);
|
|
|
|
|
|
+ expect(el.src).to.be('data:image/gif;base64,' + source);
|
|
expect(el.localName).to.be('img');
|
|
expect(el.localName).to.be('img');
|
|
expect(el.innerHTML).to.be('');
|
|
expect(el.innerHTML).to.be('');
|
|
});
|
|
});
|