|
|
@@ -0,0 +1,83 @@
|
|
|
+/**
|
|
|
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
|
|
|
+ * For licensing, see LICENSE.md.
|
|
|
+ */
|
|
|
+
|
|
|
+/* bender-tags: browser-only */
|
|
|
+
|
|
|
+import XmlDataProcessor from '/ckeditor5/engine/dataprocessor/xmldataprocessor.js';
|
|
|
+import xssTemplates from '/tests/engine/dataprocessor/_utils/xsstemplates.js';
|
|
|
+import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
|
|
|
+import { stringify, parse } from '/tests/engine/_utils/view.js';
|
|
|
+
|
|
|
+describe( 'XmlDataProcessor', () => {
|
|
|
+ const dataProcessor = new XmlDataProcessor();
|
|
|
+
|
|
|
+ describe( 'toView', () => {
|
|
|
+ it( 'should return empty DocumentFragment when empty string is passed', () => {
|
|
|
+ const fragment = dataProcessor.toView( '' );
|
|
|
+ expect( fragment ).to.be.an.instanceOf( ViewDocumentFragment );
|
|
|
+ expect( fragment.childCount ).to.equal( 0 );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should convert XML to DocumentFragment with single text node', () => {
|
|
|
+ const fragment = dataProcessor.toView( 'foo bar' );
|
|
|
+
|
|
|
+ expect( stringify( fragment ) ).to.equal( 'foo bar' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should convert HTML to DocumentFragment with multiple child nodes', () => {
|
|
|
+ const fragment = dataProcessor.toView( '<p>foo</p><p>bar</p>' );
|
|
|
+
|
|
|
+ expect( stringify( fragment ) ).to.equal( '<p>foo</p><p>bar</p>' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should not add any additional nodes', () => {
|
|
|
+ const fragment = dataProcessor.toView( 'foo <b>bar</b> text' );
|
|
|
+
|
|
|
+ expect( stringify( fragment ) ).to.equal( 'foo <b>bar</b> text' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should thrown an error when markup is invalid', () => {
|
|
|
+ expect( () => {
|
|
|
+ dataProcessor.toView( '<b>missing closing tag' );
|
|
|
+ } ).to.throw( Error, /Parse error/ );
|
|
|
+ } );
|
|
|
+
|
|
|
+ // Test against XSS attacks.
|
|
|
+ for ( let name in xssTemplates ) {
|
|
|
+ const input = xssTemplates[ name ].replace( /%xss%/g, 'testXss()' );
|
|
|
+
|
|
|
+ it( 'should prevent XSS attacks: ' + name, ( done ) => {
|
|
|
+ window.testXss = sinon.spy();
|
|
|
+ dataProcessor.toView( input );
|
|
|
+
|
|
|
+ setTimeout( () => {
|
|
|
+ sinon.assert.notCalled( window.testXss );
|
|
|
+ done();
|
|
|
+ }, 10 );
|
|
|
+ } );
|
|
|
+ }
|
|
|
+ } );
|
|
|
+
|
|
|
+ describe( 'toData', () => {
|
|
|
+ it( 'should return empty string when empty DocumentFragment is passed', () => {
|
|
|
+ const fragment = new ViewDocumentFragment();
|
|
|
+
|
|
|
+ expect( dataProcessor.toData( fragment ) ).to.equal( '' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should return text if document fragment with single text node is passed', () => {
|
|
|
+ const fragment = new ViewDocumentFragment();
|
|
|
+ fragment.appendChildren( parse( 'foo bar' ) );
|
|
|
+
|
|
|
+ expect( dataProcessor.toData( fragment ) ).to.equal( 'foo bar' );
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should convert HTML to DocumentFragment with multiple child nodes', () => {
|
|
|
+ const fragment = parse( '<p>foo</p><p>bar</p>' );
|
|
|
+
|
|
|
+ expect( dataProcessor.toData( fragment ) ).to.equal( '<p>foo</p><p>bar</p>' );
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+} );
|