import { LegacyUnit } from '@ephox/mcagar'; import { Pipeline } from '@ephox/agar'; import Schema from 'tinymce/core/api/html/Schema'; import { UnitTest } from '@ephox/bedrock'; UnitTest.asynctest('browser.tinymce.core.html.SchemaTest', function () { const success = arguments[arguments.length - 2]; const failure = arguments[arguments.length - 1]; const suite = LegacyUnit.createSuite(); const ok = function (value, label?) { return LegacyUnit.equal(value, true, label); }; suite.test('Valid elements global rule', function () { const schema = Schema({ valid_elements: '@[id|style],img[src|-style]' }); LegacyUnit.deepEqual(schema.getElementRule('img'), { attributes: { id: {}, src: {} }, attributesOrder: ['id', 'src'] }); }); suite.test('Whildcard element rule', function () { let schema; schema = Schema({ valid_elements: '*[id|class]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); schema = Schema({ valid_elements: 'b*[id|class]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); LegacyUnit.deepEqual(schema.getElementRule('body').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('body').attributesOrder, ['id', 'class']); LegacyUnit.equal(schema.getElementRule('img'), undefined); schema = Schema({ valid_elements: 'b?[id|class]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); LegacyUnit.deepEqual(schema.getElementRule('bx').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('bx').attributesOrder, ['id', 'class']); LegacyUnit.equal(schema.getElementRule('body'), undefined); schema = Schema({ valid_elements: 'b+[id|class]' }); LegacyUnit.deepEqual(schema.getElementRule('body').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('body').attributesOrder, ['id', 'class']); LegacyUnit.deepEqual(schema.getElementRule('bx').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('bx').attributesOrder, ['id', 'class']); LegacyUnit.equal(schema.getElementRule('b'), undefined); }); suite.test('Whildcard attribute rule', function () { let schema; schema = Schema({ valid_elements: 'b[id|class|*]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); ok(schema.getElementRule('b').attributePatterns[0].pattern.test('x')); schema = Schema({ valid_elements: 'b[id|class|x?]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); ok(schema.getElementRule('b').attributePatterns[0].pattern.test('xy')); ok(!schema.getElementRule('b').attributePatterns[0].pattern.test('xba')); ok(!schema.getElementRule('b').attributePatterns[0].pattern.test('a')); schema = Schema({ valid_elements: 'b[id|class|x+]' }); LegacyUnit.deepEqual(schema.getElementRule('b').attributes, { id: {}, class: {} }); LegacyUnit.deepEqual(schema.getElementRule('b').attributesOrder, ['id', 'class']); ok(!schema.getElementRule('b').attributePatterns[0].pattern.test('x')); ok(schema.getElementRule('b').attributePatterns[0].pattern.test('xb')); ok(schema.getElementRule('b').attributePatterns[0].pattern.test('xba')); }); suite.test('Valid attributes and attribute order', function () { let schema; schema = Schema({ valid_elements: 'div,a[href|title],b[title]' }); LegacyUnit.deepEqual(schema.getElementRule('div'), { attributes: {}, attributesOrder: [] }); LegacyUnit.deepEqual(schema.getElementRule('a'), { attributes: { href: {}, title: {} }, attributesOrder: ['href', 'title'] }); LegacyUnit.deepEqual(schema.getElementRule('b'), { attributes: { title: {} }, attributesOrder: ['title'] }); }); suite.test('Required any attributes', function () { let schema; schema = Schema({ valid_elements: 'a![id|style|href]' }); LegacyUnit.deepEqual( schema.getElementRule('a'), { attributes: { href: {}, id: {}, style: {} }, attributesOrder: ['id', 'style', 'href'], removeEmptyAttrs: true } ); }); suite.test('Required attributes', function () { let schema; schema = Schema({ valid_elements: 'a[!href|!name]' }); LegacyUnit.deepEqual( schema.getElementRule('a'), { attributes: { href: { required: true }, name: { required: true } }, attributesOrder: ['href', 'name'], attributesRequired: ['href', 'name'] } ); }); suite.test('Default attribute values', function () { let schema; schema = Schema({ valid_elements: 'img[border=0]' }); LegacyUnit.deepEqual( schema.getElementRule('img'), { attributes: { border: { defaultValue: '0' } }, attributesOrder: ['border'], attributesDefault: [{ name: 'border', value: '0' }] } ); }); suite.test('Forced attribute values', function () { let schema; schema = Schema({ valid_elements: 'img[border:0]' }); LegacyUnit.deepEqual( schema.getElementRule('img'), { attributes: { border: { forcedValue: '0' } }, attributesOrder: ['border'], attributesForced: [{ name: 'border', value: '0' }] } ); }); suite.test('Required attribute values', function () { let schema; schema = Schema({ valid_elements: 'span[dir