浏览代码

Started converting schema usage to the new API.

Piotrek Koszuliński 8 年之前
父节点
当前提交
8650b26165
共有 28 个文件被更改,包括 365 次插入320 次删除
  1. 1 1
      packages/ckeditor5-engine/src/model/document.js
  2. 1 1
      packages/ckeditor5-engine/src/model/documentselection.js
  3. 14 1
      packages/ckeditor5-engine/src/model/model.js
  4. 1 1
      packages/ckeditor5-engine/src/model/utils/deletecontent.js
  5. 2 2
      packages/ckeditor5-engine/src/model/utils/insertcontent.js
  6. 2 2
      packages/ckeditor5-engine/src/model/utils/modifyselection.js
  7. 28 28
      packages/ckeditor5-engine/tests/controller/datacontroller.js
  8. 4 4
      packages/ckeditor5-engine/tests/controller/editingcontroller.js
  9. 8 8
      packages/ckeditor5-engine/tests/conversion/buildviewconverter.js
  10. 6 6
      packages/ckeditor5-engine/tests/conversion/definition-based-converters.js
  11. 9 9
      packages/ckeditor5-engine/tests/conversion/model-selection-to-view-converters.js
  12. 1 1
      packages/ckeditor5-engine/tests/conversion/view-selection-to-model-converters.js
  13. 2 2
      packages/ckeditor5-engine/tests/conversion/view-to-model-converters.js
  14. 15 15
      packages/ckeditor5-engine/tests/dev-utils/model.js
  15. 4 3
      packages/ckeditor5-engine/tests/manual/highlight.js
  16. 8 7
      packages/ckeditor5-engine/tests/manual/nestededitable.js
  17. 9 9
      packages/ckeditor5-engine/tests/model/document/document.js
  18. 17 15
      packages/ckeditor5-engine/tests/model/documentselection.js
  19. 8 8
      packages/ckeditor5-engine/tests/model/liverange.js
  20. 17 16
      packages/ckeditor5-engine/tests/model/model.js
  21. 1 1
      packages/ckeditor5-engine/tests/model/operation/utils.js
  22. 6 1
      packages/ckeditor5-engine/tests/model/schema.js
  23. 16 16
      packages/ckeditor5-engine/tests/model/selection.js
  24. 77 66
      packages/ckeditor5-engine/tests/model/utils/deletecontent.js
  25. 19 19
      packages/ckeditor5-engine/tests/model/utils/getselectedcontent.js
  26. 57 51
      packages/ckeditor5-engine/tests/model/utils/insertcontent.js
  27. 28 24
      packages/ckeditor5-engine/tests/model/utils/modifyselection.js
  28. 4 3
      packages/ckeditor5-engine/tests/tickets/699.js

+ 1 - 1
packages/ckeditor5-engine/src/model/document.js

@@ -266,7 +266,7 @@ export default class Document {
 			const type = ( data.walker == backwardWalker ? 'elementEnd' : 'elementStart' );
 			const value = data.value;
 
-			if ( value.type == type && schema.objects.has( value.item.name ) ) {
+			if ( value.type == type && schema.isObject( value.item.name ) ) {
 				return Range.createOn( value.item );
 			}
 

+ 1 - 1
packages/ckeditor5-engine/src/model/documentselection.js

@@ -621,7 +621,7 @@ export default class DocumentSelection extends Selection {
 			// ...look for a first character node in that range and take attributes from it.
 			for ( const value of range ) {
 				// If the item is an object, we don't want to get attributes from its children.
-				if ( value.item.is( 'element' ) && schema.objects.has( value.item.name ) ) {
+				if ( value.item.is( 'element' ) && schema.isObject( value.item.name ) ) {
 					break;
 				}
 

+ 14 - 1
packages/ckeditor5-engine/src/model/model.js

@@ -68,6 +68,19 @@ export default class Model {
 
 		[ 'insertContent', 'deleteContent', 'modifySelection', 'getSelectedContent', 'applyOperation' ]
 			.forEach( methodName => this.decorate( methodName ) );
+
+		// Register some default abstract entities.
+		this.schema.register( '$root', { isLimit: true } );
+		this.schema.register( '$block', { allowIn: '$root' } );
+		this.schema.register( '$text', { allowIn: '$block' } );
+
+		// TMP!
+		// Create an "all allowed" context in the schema for processing the pasted content.
+		// Read: https://github.com/ckeditor/ckeditor5-engine/issues/638#issuecomment-255086588
+		//
+		// TODO
+		// this.schema.register( '$clipboardHolder', '$root' );
+		// this.schema.allow( { name: '$inline', inside: '$clipboardHolder' } );
 	}
 
 	/**
@@ -296,7 +309,7 @@ export default class Model {
 
 		for ( const item of rangeOrElement.getItems() ) {
 			// Remember, `TreeWalker` returns always `textProxy` nodes.
-			if ( item.is( 'textProxy' ) || this.schema.objects.has( item.name ) ) {
+			if ( item.is( 'textProxy' ) || this.schema.isObject( item.name ) ) {
 				return true;
 			}
 		}

+ 1 - 1
packages/ckeditor5-engine/src/model/utils/deletecontent.js

@@ -173,7 +173,7 @@ function checkCanBeMerged( leftPos, rightPos, schema ) {
 	const rangeToCheck = new Range( leftPos, rightPos );
 
 	for ( const value of rangeToCheck.getWalker() ) {
-		if ( schema.objects.has( value.item.name ) || schema.limits.has( value.item.name ) ) {
+		if ( schema.isObject( value.item.name ) || schema.isLimit( value.item.name ) ) {
 			return false;
 		}
 	}

+ 2 - 2
packages/ckeditor5-engine/src/model/utils/insertcontent.js

@@ -370,7 +370,7 @@ class Insertion {
 
 		while ( allowedIn != this.position.parent ) {
 			// If a parent which we'd need to leave is a limit element, break.
-			if ( this.schema.limits.has( this.position.parent.name ) ) {
+			if ( this.schema.isLimit( this.position.parent.name ) ) {
 				return false;
 			}
 
@@ -438,7 +438,7 @@ class Insertion {
 	 * @param {module:engine/model/node~Node} node The node to check.
 	 */
 	_checkIsObject( node ) {
-		return this.schema.objects.has( getNodeSchemaName( node ) );
+		return this.schema.isObject( getNodeSchemaName( node ) );
 	}
 }
 

+ 2 - 2
packages/ckeditor5-engine/src/model/utils/modifyselection.js

@@ -82,7 +82,7 @@ function tryExtendingTo( data, value ) {
 	// Entering an element.
 	if ( value.type == ( data.isForward ? 'elementStart' : 'elementEnd' ) ) {
 		// If it's an object, we can select it now.
-		if ( data.schema.objects.has( value.item.name ) ) {
+		if ( data.schema.isObject( value.item.name ) ) {
 			return Position.createAt( value.item, data.isForward ? 'after' : 'before' );
 		}
 
@@ -94,7 +94,7 @@ function tryExtendingTo( data, value ) {
 	// Leaving an element.
 	else {
 		// If leaving a limit element, stop.
-		if ( data.schema.limits.has( value.item.name ) ) {
+		if ( data.schema.isLimit( value.item.name ) ) {
 			// NOTE: Fast-forward the walker until the end.
 			data.walker.skip( () => true );
 

+ 28 - 28
packages/ckeditor5-engine/tests/controller/datacontroller.js

@@ -45,7 +45,7 @@ describe( 'DataController', () => {
 
 	describe( 'parse()', () => {
 		it( 'should set text', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			const output = data.parse( '<p>foo<b>bar</b></p>' );
 
 			expect( output ).to.instanceof( ModelDocumentFragment );
@@ -53,7 +53,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should set paragraph', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			buildViewConverter().for( data.viewToModel ).fromElement( 'p' ).toElement( 'paragraph' );
 
@@ -64,7 +64,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should set two paragraphs', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			buildViewConverter().for( data.viewToModel ).fromElement( 'p' ).toElement( 'paragraph' );
 
@@ -75,7 +75,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should set paragraphs with bold', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			schema.allow( { name: '$text', attributes: [ 'bold' ], inside: '$block' } );
 
 			buildViewConverter().for( data.viewToModel ).fromElement( 'p' ).toElement( 'paragraph' );
@@ -102,7 +102,7 @@ describe( 'DataController', () => {
 
 	describe( 'toModel()', () => {
 		beforeEach( () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			buildViewConverter().for( data.viewToModel ).fromElement( 'p' ).toElement( 'paragraph' );
 		} );
@@ -126,8 +126,8 @@ describe( 'DataController', () => {
 		it( 'should accept parsing context', () => {
 			modelDocument.createRoot( 'inlineRoot', 'inlineRoot' );
 
-			schema.registerItem( 'inlineRoot' );
-			schema.allow( { name: '$text', inside: 'inlineRoot' } );
+			schema.register( 'inlineRoot' );
+			schema.extend( '$text', { allowIn: 'inlineRoot' } );
 
 			const viewFragment = new ViewDocumentFragment( [ parseView( 'foo' ) ] );
 
@@ -141,14 +141,14 @@ describe( 'DataController', () => {
 
 	describe( 'set()', () => {
 		it( 'should set data to root', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			data.set( 'foo' );
 
 			expect( getData( model, { withoutSelection: true } ) ).to.equal( 'foo' );
 		} );
 
 		it( 'should create a batch', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			data.set( 'foo' );
 
 			expect( count( modelDocument.history.getDeltas() ) ).to.equal( 1 );
@@ -157,7 +157,7 @@ describe( 'DataController', () => {
 		it( 'should fire #changesDone', () => {
 			const spy = sinon.spy();
 
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			modelDocument.on( 'changesDone', spy );
 
 			data.set( 'foo' );
@@ -166,7 +166,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get root name as a parameter', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			data.set( 'foo', 'main' );
 			data.set( 'Bar', 'title' );
 
@@ -179,7 +179,7 @@ describe( 'DataController', () => {
 		// This case was added when order of params was different and it really didn't work. Let's keep it
 		// if anyone will ever try to change this.
 		it( 'should allow setting empty data', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 
 			data.set( 'foo', 'title' );
 
@@ -193,7 +193,7 @@ describe( 'DataController', () => {
 
 	describe( 'get()', () => {
 		it( 'should get paragraph with text', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>foo</paragraph>' );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
@@ -202,7 +202,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get empty paragraph', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph></paragraph>' );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
@@ -211,7 +211,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get two paragraphs', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>foo</paragraph><paragraph>bar</paragraph>' );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
@@ -220,14 +220,14 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get text directly in root', () => {
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 			setData( model, 'foo' );
 
 			expect( data.get() ).to.equal( 'foo' );
 		} );
 
 		it( 'should get paragraphs without bold', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>foo<$text bold="true">bar</$text></paragraph>' );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
@@ -236,7 +236,7 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get paragraphs with bold', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>foo<$text bold="true">bar</$text></paragraph>' );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
@@ -246,8 +246,8 @@ describe( 'DataController', () => {
 		} );
 
 		it( 'should get root name as a parameter', () => {
-			schema.registerItem( 'paragraph', '$block' );
-			schema.allow( { name: '$text', inside: '$root' } );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			schema.extend( '$text', { allowIn: '$root' } );
 
 			setData( model, '<paragraph>foo</paragraph>', { rootName: 'main' } );
 			setData( model, 'Bar', { rootName: 'title' } );
@@ -263,11 +263,11 @@ describe( 'DataController', () => {
 
 	describe( 'stringify()', () => {
 		beforeEach( () => {
-			schema.registerItem( 'paragraph', '$block' );
-			schema.registerItem( 'div' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			schema.register( 'div' );
 
-			schema.allow( { name: '$block', inside: 'div' } );
-			schema.allow( { name: 'div', inside: '$root' } );
+			schema.extend( '$block', { allowIn: 'div' } );
+			schema.extend( 'div', { allowIn: '$root' } );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
 		} );
@@ -287,11 +287,11 @@ describe( 'DataController', () => {
 
 	describe( 'toView()', () => {
 		beforeEach( () => {
-			schema.registerItem( 'paragraph', '$block' );
-			schema.registerItem( 'div' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			schema.register( 'div' );
 
-			schema.allow( { name: '$block', inside: 'div' } );
-			schema.allow( { name: 'div', inside: '$root' } );
+			schema.extend( '$block', { allowIn: 'div' } );
+			schema.extend( 'div', { allowIn: '$root' } );
 
 			buildModelConverter().for( data.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
 		} );

+ 4 - 4
packages/ckeditor5-engine/tests/controller/editingcontroller.js

@@ -140,8 +140,8 @@ describe( 'EditingController', () => {
 			document.body.appendChild( domRoot );
 			viewRoot = editing.createRoot( domRoot );
 
-			model.schema.registerItem( 'paragraph', '$block' );
-			model.schema.registerItem( 'div', '$block' );
+			model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			model.schema.register( 'div', { inheritAllFrom: '$block' } );
 			buildModelConverter().for( editing.modelToView ).fromElement( 'paragraph' ).toElement( 'p' );
 			buildModelConverter().for( editing.modelToView ).fromElement( 'div' ).toElement( 'div' );
 			buildModelConverter().for( editing.modelToView ).fromMarker( 'marker' ).toHighlight( {} );
@@ -396,7 +396,7 @@ describe( 'EditingController', () => {
 		it( 'should remove listenters', () => {
 			const model = new Model();
 			model.document.createRoot();
-			model.schema.registerItem( 'paragraph', '$block' );
+			model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			const editing = new EditingController( model );
 
@@ -420,7 +420,7 @@ describe( 'EditingController', () => {
 		it( 'should destroy view', () => {
 			const model = new Model();
 			model.document.createRoot();
-			model.schema.registerItem( 'paragraph', '$block' );
+			model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			const editing = new EditingController( model );
 

+ 8 - 8
packages/ckeditor5-engine/tests/conversion/buildviewconverter.js

@@ -74,17 +74,17 @@ describe( 'View converter builder', () => {
 
 		schema = new ModelSchema();
 
-		schema.registerItem( 'paragraph', '$block' );
-		schema.registerItem( 'div', '$block' );
-		schema.registerItem( 'customP', 'paragraph' );
-		schema.registerItem( 'image', '$inline' );
-		schema.registerItem( 'span', '$inline' );
-		schema.registerItem( 'MEGATRON', '$inline' ); // Yes, folks, we are building MEGATRON.
-		schema.registerItem( 'abcd', '$inline' );
+		schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+		schema.register( 'div', { inheritAllFrom: '$block' } );
+		schema.register( 'customP', { inheritAllFrom: 'paragraph' } );
+		schema.register( 'image', { inheritAllFrom: '$inline' } );
+		schema.register( 'span', { inheritAllFrom: '$inline' } );
+		schema.register( 'MEGATRON', { inheritAllFrom: '$inline' } ); // Yes, folks, we are building MEGATRON.
+		schema.register( 'abcd', { inheritAllFrom: '$inline' } );
 		schema.allow( { name: '$inline', attributes: textAttributes, inside: '$root' } );
 		schema.allow( { name: 'image', attributes: [ 'src' ], inside: '$root' } );
 		schema.allow( { name: 'image', attributes: [ 'src' ], inside: '$block' } );
-		schema.allow( { name: '$text', inside: '$inline' } );
+		schema.extend( '$text', { allowIn: '$inline' } );
 		schema.allow( { name: '$text', attributes: textAttributes, inside: '$block' } );
 		schema.allow( { name: '$text', attributes: textAttributes, inside: '$root' } );
 		schema.allow( { name: 'paragraph', attributes: pAttributes, inside: '$root' } );

+ 6 - 6
packages/ckeditor5-engine/tests/conversion/definition-based-converters.js

@@ -214,10 +214,10 @@ describe( 'definition-based-converters', () => {
 			beforeEach( () => {
 				setupViewToModelTests();
 
-				schema.registerItem( 'div', '$block' );
+				schema.register( 'div', { inheritAllFrom: '$block' } );
 
 				schema.allow( { name: '$inline', attributes: [ 'foo' ], inside: '$root' } );
-				schema.allow( { name: '$text', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
 
 				dispatcher.on( 'text', convertText() );
 			} );
@@ -377,12 +377,12 @@ describe( 'definition-based-converters', () => {
 			beforeEach( () => {
 				setupViewToModelTests();
 
-				schema.registerItem( 'div', '$block' );
-				schema.registerItem( 'bar', '$block' );
-				schema.registerItem( 'baz', '$block' );
+				schema.register( 'div', { inheritAllFrom: '$block' } );
+				schema.register( 'bar', { inheritAllFrom: '$block' } );
+				schema.register( 'baz', { inheritAllFrom: '$block' } );
 
 				schema.allow( { name: '$inline', attribute: [ 'foo' ], inside: '$root' } );
-				schema.allow( { name: '$text', inside: '$inline' } );
+				schema.extend( '$text', { allowIn: '$inline' } );
 
 				dispatcher.on( 'text', convertText() );
 			} );

+ 9 - 9
packages/ckeditor5-engine/tests/conversion/model-selection-to-view-converters.js

@@ -46,7 +46,7 @@ describe( 'model-selection-to-view-converters', () => {
 		modelRoot = modelDoc.createRoot();
 		modelSelection = modelDoc.selection;
 
-		model.schema.allow( { name: '$text', inside: '$root' } );
+		model.schema.extend( '$text', { allowIn: '$root' } );
 
 		viewDoc = new ViewDocument();
 		viewRoot = viewDoc.createRoot( 'div' );
@@ -637,14 +637,14 @@ describe( 'model-selection-to-view-converters', () => {
 
 	describe( 'table cell selection converter', () => {
 		beforeEach( () => {
-			model.schema.registerItem( 'table' );
-			model.schema.registerItem( 'tr' );
-			model.schema.registerItem( 'td' );
-
-			model.schema.allow( { name: 'table', inside: '$root' } );
-			model.schema.allow( { name: 'tr', inside: 'table' } );
-			model.schema.allow( { name: 'td', inside: 'tr' } );
-			model.schema.allow( { name: '$text', inside: 'td' } );
+			model.schema.register( 'table' );
+			model.schema.register( 'tr' );
+			model.schema.register( 'td' );
+
+			model.schema.extend( 'table', { allowIn: '$root' } );
+			model.schema.extend( 'tr', { allowIn: 'table' } );
+			model.schema.extend( 'td', { allowIn: 'tr' } );
+			model.schema.extend( '$text', { allowIn: 'td' } );
 
 			// "Universal" converter to convert table structure.
 			const tableConverter = insertElement( data => new ViewContainerElement( data.item.name ) );

+ 1 - 1
packages/ckeditor5-engine/tests/conversion/view-selection-to-model-converters.js

@@ -21,7 +21,7 @@ describe( 'convertSelectionChange', () => {
 	beforeEach( () => {
 		model = new Model();
 		modelRoot = model.document.createRoot();
-		model.schema.registerItem( 'paragraph', '$block' );
+		model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 		modelSetData( model, '<paragraph>foo</paragraph><paragraph>bar</paragraph>' );
 

+ 2 - 2
packages/ckeditor5-engine/tests/conversion/view-to-model-converters.js

@@ -23,8 +23,8 @@ describe( 'view-to-model-converters', () => {
 
 	beforeEach( () => {
 		schema = new ModelSchema();
-		schema.registerItem( 'paragraph', '$block' );
-		schema.allow( { name: '$text', inside: '$root' } );
+		schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+		schema.extend( '$text', { allowIn: '$root' } );
 		additionalData = { context: [ '$root' ] };
 		dispatcher = new ViewConversionDispatcher( model, { schema } );
 	} );

+ 15 - 15
packages/ckeditor5-engine/tests/dev-utils/model.js

@@ -23,22 +23,22 @@ describe( 'model test utils', () => {
 		sandbox = sinon.sandbox.create();
 		selection.removeAllRanges();
 
-		model.schema.registerItem( 'a', '$inline' );
-		model.schema.allow( { name: 'a', inside: '$root' } );
+		model.schema.register( 'a', { inheritAllFrom: '$inline' } );
+		model.schema.extend( 'a', { allowIn: '$root' } );
 		model.schema.allow( { name: 'a', inside: '$root', attributes: [ 'bar', 'car', 'foo' ] } );
 
-		model.schema.registerItem( 'b', '$inline' );
-		model.schema.allow( { name: 'b', inside: '$root' } );
+		model.schema.register( 'b', { inheritAllFrom: '$inline' } );
+		model.schema.extend( 'b', { allowIn: '$root' } );
 		model.schema.allow( { name: 'b', inside: '$root', attributes: [ 'barFoo', 'fooBar', 'x' ] } );
 
-		model.schema.registerItem( 'c', '$inline' );
-		model.schema.allow( { name: 'c', inside: '$root' } );
+		model.schema.register( 'c', { inheritAllFrom: '$inline' } );
+		model.schema.extend( 'c', { allowIn: '$root' } );
 
-		model.schema.registerItem( 'paragraph', '$block' );
-		model.schema.allow( { name: '$text', inside: '$root' } );
-		model.schema.allow( { name: '$text', inside: 'a' } );
-		model.schema.allow( { name: '$text', inside: 'b' } );
-		model.schema.allow( { name: 'c', inside: 'b' } );
+		model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+		model.schema.extend( '$text', { allowIn: '$root' } );
+		model.schema.extend( '$text', { allowIn: 'a' } );
+		model.schema.extend( '$text', { allowIn: 'b' } );
+		model.schema.extend( 'c', { allowIn: 'b' } );
 	} );
 
 	afterEach( () => {
@@ -162,8 +162,8 @@ describe( 'model test utils', () => {
 		it( 'should work in a special root', () => {
 			const model = new Model();
 
-			model.schema.registerItem( 'textOnly' );
-			model.schema.allow( { name: '$text', inside: 'textOnly' } );
+			model.schema.register( 'textOnly' );
+			model.schema.extend( '$text', { allowIn: 'textOnly' } );
 			model.document.createRoot( 'textOnly', 'textOnly' );
 
 			setData( model, 'a[b]c', { rootName: 'textOnly' } );
@@ -517,8 +517,8 @@ describe( 'model test utils', () => {
 
 		it( 'converts data in the specified context', () => {
 			const model = new Model();
-			model.schema.registerItem( 'foo' );
-			model.schema.allow( { name: '$text', inside: 'foo' } );
+			model.schema.register( 'foo' );
+			model.schema.extend( '$text', { allowIn: 'foo' } );
 
 			expect( () => {
 				parse( 'text', model.schema, { context: [ 'foo' ] } );

+ 4 - 3
packages/ckeditor5-engine/tests/manual/highlight.js

@@ -37,9 +37,10 @@ class FancyWidget extends Plugin {
 		const editing = editor.editing;
 
 		// Configure schema.
-		schema.registerItem( 'fancywidget' );
-		schema.allow( { name: 'fancywidget', inside: '$root' } );
-		schema.objects.add( 'fancywidget' );
+		schema.register( 'fancywidget', {
+			isObject: true
+		} );
+		schema.extend( 'fancywidget', { allowIn: '$root' } );
 
 		// Build converter from model to view for editing pipeline.
 		buildModelConverter().for( editing.modelToView )

+ 8 - 7
packages/ckeditor5-engine/tests/manual/nestededitable.js

@@ -28,14 +28,15 @@ class NestedEditable extends Plugin {
 		const data = editor.data;
 		const schema = editor.model.schema;
 
-		schema.registerItem( 'figure' );
-		schema.registerItem( 'figcaption' );
-		schema.allow( { name: 'figure', inside: '$root' } );
-		schema.allow( { name: 'figcaption', inside: 'figure' } );
-		schema.objects.add( 'figure' );
+		schema.register( 'figure', {
+			isObject: true
+		} );
+		schema.register( 'figcaption' );
+		schema.extend( 'figure', { allowIn: '$root' } );
+		schema.extend( 'figcaption', { allowIn: 'figure' } );
 
-		schema.allow( { name: '$inline', inside: 'figure' } );
-		schema.allow( { name: '$inline', inside: 'figcaption' } );
+		schema.extend( '$inline', { allowIn: 'figure' } );
+		schema.extend( '$inline', { allowIn: 'figcaption' } );
 
 		buildModelConverter().for( data.modelToView, editing.modelToView )
 			.fromElement( 'figure' )

+ 9 - 9
packages/ckeditor5-engine/tests/model/document/document.js

@@ -246,18 +246,18 @@ describe( 'Document', () => {
 		let selection;
 
 		beforeEach( () => {
-			model.schema.registerItem( 'paragraph', '$block' );
+			model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
-			model.schema.registerItem( 'emptyBlock' );
-			model.schema.allow( { name: 'emptyBlock', inside: '$root' } );
+			model.schema.register( 'emptyBlock' );
+			model.schema.extend( 'emptyBlock', { allowIn: '$root' } );
 
-			model.schema.registerItem( 'widget' );
-			model.schema.allow( { name: 'widget', inside: '$root' } );
-			model.schema.objects.add( 'widget' );
+			model.schema.register( 'widget', {
+				isObject: true
+			} );
+			model.schema.extend( 'widget', { allowIn: '$root' } );
 
-			model.schema.registerItem( 'blockWidget', '$block' );
-			model.schema.allow( { name: 'blockWidget', inside: '$root' } );
-			model.schema.objects.add( 'blockWidget' );
+			model.schema.register( 'blockWidget', { inheritAllFrom: '$block' } );
+			model.schema.extend( 'blockWidget', { allowIn: '$root' } );
 
 			doc.createRoot();
 			selection = doc.selection;

+ 17 - 15
packages/ckeditor5-engine/tests/model/documentselection.js

@@ -46,10 +46,11 @@ describe( 'DocumentSelection', () => {
 			new Element( 'p', [], new Text( 'foobar' ) )
 		] );
 		selection = doc.selection;
-		model.schema.registerItem( 'p', '$block' );
+		model.schema.register( 'p', { inheritAllFrom: '$block' } );
 
-		model.schema.registerItem( 'widget' );
-		model.schema.objects.add( 'widget' );
+		model.schema.register( 'widget', {
+			isObject: true
+		} );
 
 		liveRange = new LiveRange( new Position( root, [ 0 ] ), new Position( root, [ 1 ] ) );
 		range = new Range( new Position( root, [ 2 ] ), new Position( root, [ 2, 2 ] ) );
@@ -94,8 +95,8 @@ describe( 'DocumentSelection', () => {
 				new Element( 'img' ),
 				new Element( 'p', [], new Text( 'foobar' ) )
 			] );
-			model.schema.registerItem( 'img' );
-			model.schema.registerItem( 'p', '$block' );
+			model.schema.register( 'img' );
+			model.schema.register( 'p', { inheritAllFrom: '$block' } );
 			selection = doc.selection;
 
 			const ranges = Array.from( selection.getRanges() );
@@ -360,7 +361,7 @@ describe( 'DocumentSelection', () => {
 
 		// See #630.
 		it( 'should refresh attributes – integration test for #630', () => {
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 
 			setData( model, 'f<$text italic="true">[o</$text><$text bold="true">ob]a</$text>r' );
 
@@ -941,15 +942,16 @@ describe( 'DocumentSelection', () => {
 		// #986
 		describe( 'are not inherited from the inside of object elements', () => {
 			beforeEach( () => {
-				model.schema.registerItem( 'image' );
-				model.schema.allow( { name: 'image', inside: '$root' } );
-				model.schema.allow( { name: 'image', inside: '$block' } );
-				model.schema.allow( { name: '$inline', inside: 'image' } );
-				model.schema.objects.add( 'image' );
-
-				model.schema.registerItem( 'caption' );
-				model.schema.allow( { name: '$inline', inside: 'caption' } );
-				model.schema.allow( { name: 'caption', inside: 'image' } );
+				model.schema.register( 'image', {
+					isObject: true
+				} );
+				model.schema.extend( 'image', { allowIn: '$root' } );
+				model.schema.extend( 'image', { allowIn: '$block' } );
+				model.schema.extend( '$inline', { allowIn: 'image' } );
+
+				model.schema.register( 'caption' );
+				model.schema.extend( '$inline', { allowIn: 'caption' } );
+				model.schema.extend( 'caption', { allowIn: 'image' } );
 				model.schema.allow( { name: '$text', attributes: 'bold', inside: 'caption' } );
 			} );
 

+ 8 - 8
packages/ckeditor5-engine/tests/model/liverange.js

@@ -430,11 +430,11 @@ describe( 'LiveRange', () => {
 			let live;
 
 			beforeEach( () => {
-				model.schema.registerItem( 'p', '$block' );
-				model.schema.registerItem( 'w' );
+				model.schema.register( 'p', { inheritAllFrom: '$block' } );
+				model.schema.register( 'w' );
 
-				model.schema.allow( { name: 'p', inside: 'w' } );
-				model.schema.allow( { name: 'w', inside: '$root' } );
+				model.schema.extend( 'p', { allowIn: 'w' } );
+				model.schema.extend( 'w', { allowIn: '$root' } );
 			} );
 
 			afterEach( () => {
@@ -526,11 +526,11 @@ describe( 'LiveRange', () => {
 			let live;
 
 			beforeEach( () => {
-				model.schema.registerItem( 'p', '$block' );
-				model.schema.registerItem( 'w' );
+				model.schema.register( 'p', { inheritAllFrom: '$block' } );
+				model.schema.register( 'w' );
 
-				model.schema.allow( { name: 'p', inside: 'w' } );
-				model.schema.allow( { name: 'w', inside: '$root' } );
+				model.schema.extend( 'p', { allowIn: 'w' } );
+				model.schema.extend( 'w', { allowIn: '$root' } );
 			} );
 
 			afterEach( () => {

+ 17 - 16
packages/ckeditor5-engine/tests/model/model.js

@@ -374,7 +374,7 @@ describe( 'Model', () => {
 
 	describe( 'insertContent()', () => {
 		it( 'should be decorated', () => {
-			schema.allow( { name: '$text', inside: '$root' } ); // To surpress warnings.
+			schema.extend( '$text', { allowIn: '$root' } ); // To surpress warnings.
 
 			const spy = sinon.spy();
 
@@ -386,7 +386,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should insert content (item)', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[]ar</paragraph>' );
 
@@ -396,7 +396,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should insert content (document fragment)', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[]ar</paragraph>' );
 
@@ -406,7 +406,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should use parent batch', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>[]</paragraph>' );
 
 			model.change( writer => {
@@ -428,7 +428,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should delete selected content', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
@@ -438,7 +438,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should use parent batch', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
@@ -451,7 +451,7 @@ describe( 'Model', () => {
 
 	describe( 'modifySelection()', () => {
 		it( 'should be decorated', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
 			const spy = sinon.spy();
@@ -464,7 +464,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should modify a selection', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
@@ -487,7 +487,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should return selected content', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
@@ -497,7 +497,7 @@ describe( 'Model', () => {
 		} );
 
 		it( 'should use parent batch', () => {
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
@@ -512,12 +512,13 @@ describe( 'Model', () => {
 		let root;
 
 		beforeEach( () => {
-			schema.registerItem( 'paragraph', '$block' );
-			schema.registerItem( 'div', '$block' );
-			schema.allow( { name: '$block', inside: 'div' } );
-			schema.registerItem( 'image' );
-			schema.allow( { name: 'image', inside: 'div' } );
-			schema.objects.add( 'image' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			schema.register( 'div', { inheritAllFrom: '$block' } );
+			schema.extend( '$block', { allowIn: 'div' } );
+			schema.register( 'image', {
+				isObject: true
+			} );
+			schema.extend( 'image', { allowIn: 'div' } );
 
 			setData(
 				model,

+ 1 - 1
packages/ckeditor5-engine/tests/model/operation/utils.js

@@ -21,7 +21,7 @@ describe( 'Operation utils', () => {
 	beforeEach( () => {
 		model = new Model();
 		doc = model.document;
-		model.schema.allow( { name: '$text', inside: '$root' } );
+		model.schema.extend( '$text', { allowIn: '$root' } );
 
 		root = doc.createRoot();
 

+ 6 - 1
packages/ckeditor5-engine/tests/model/schema.js

@@ -1275,5 +1275,10 @@ describe( 'Schema', () => {
 	// * checkAttributeInSelection
 	// * getLimitElement
 	// * removeDisallowedAttributes
-	// * checkChild()'s both params normalization
+	// * test checkChild()'s both params normalization
+	//   * and see insertContent's _checkIsObject()
+	// * add normalization to isObject(), isLimit(), isBlock(), isRegistered() and improve the existing code
+	// * inheritAllFrom should also inherit is* props (see tests documentselection getNearestSelectionRange())
+	// * test the default abstract entities (in model.js)
+	// * see clipboardHolder definition (and rename it to the pastebin)
 } );

+ 16 - 16
packages/ckeditor5-engine/tests/model/selection.js

@@ -891,7 +891,7 @@ describe( 'Selection', () => {
 
 		beforeEach( () => {
 			schema = new Schema();
-			schema.registerItem( 'p', '$block' );
+			schema.register( 'p', { inheritAllFrom: '$block' } );
 		} );
 
 		it( 'should return selected element', () => {
@@ -926,21 +926,21 @@ describe( 'Selection', () => {
 
 	describe( 'getSelectedBlocks()', () => {
 		beforeEach( () => {
-			model.schema.registerItem( 'p', '$block' );
-			model.schema.registerItem( 'h', '$block' );
+			model.schema.register( 'p', { inheritAllFrom: '$block' } );
+			model.schema.register( 'h', { inheritAllFrom: '$block' } );
 
-			model.schema.registerItem( 'blockquote' );
-			model.schema.allow( { name: 'blockquote', inside: '$root' } );
-			model.schema.allow( { name: '$block', inside: 'blockquote' } );
+			model.schema.register( 'blockquote' );
+			model.schema.extend( 'blockquote', { allowIn: '$root' } );
+			model.schema.extend( '$block', { allowIn: 'blockquote' } );
 
-			model.schema.registerItem( 'image' );
-			model.schema.allow( { name: 'image', inside: '$root' } );
-			model.schema.allow( { name: 'image', inside: '$block' } );
-			model.schema.allow( { name: '$text', inside: 'image' } );
+			model.schema.register( 'image' );
+			model.schema.extend( 'image', { allowIn: '$root' } );
+			model.schema.extend( 'image', { allowIn: '$block' } );
+			model.schema.extend( '$text', { allowIn: 'image' } );
 
 			// Special block which can contain another blocks.
-			model.schema.registerItem( 'nestedBlock', '$block' );
-			model.schema.allow( { name: 'nestedBlock', inside: '$block' } );
+			model.schema.register( 'nestedBlock', { inheritAllFrom: '$block' } );
+			model.schema.extend( 'nestedBlock', { allowIn: '$block' } );
 		} );
 
 		it( 'returns an iterator', () => {
@@ -1310,8 +1310,8 @@ describe( 'Selection', () => {
 
 	describe( 'containsEntireContent()', () => {
 		beforeEach( () => {
-			model.schema.registerItem( 'p', '$block' );
-			model.schema.allow( { name: 'p', inside: '$root' } );
+			model.schema.register( 'p', { inheritAllFrom: '$block' } );
+			model.schema.extend( 'p', { allowIn: '$root' } );
 		} );
 
 		it( 'returns true if the entire content in $root is selected', () => {
@@ -1345,8 +1345,8 @@ describe( 'Selection', () => {
 		} );
 
 		it( 'returns false when the entire content except an empty element is selected', () => {
-			model.schema.registerItem( 'img', '$inline' );
-			model.schema.allow( { name: 'img', inside: 'p' } );
+			model.schema.register( 'img', { inheritAllFrom: '$inline' } );
+			model.schema.extend( 'img', { allowIn: 'p' } );
 
 			setData( model, '<p><img></img>[Foo]</p>' );
 

+ 77 - 66
packages/ckeditor5-engine/tests/model/utils/deletecontent.js

@@ -19,7 +19,7 @@ describe( 'DataController utils', () => {
 			doc = model.document;
 			doc.createRoot();
 
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 			setData( model, 'x[abc]x' );
 
 			model.change( writer => {
@@ -36,10 +36,10 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'image', '$inline' );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
 
-				schema.allow( { name: '$text', inside: '$root' } );
-				schema.allow( { name: 'image', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
+				schema.extend( 'image', { allowIn: '$root' } );
 			} );
 
 			test(
@@ -101,10 +101,10 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'image', '$inline' );
-				schema.registerItem( 'paragraph', '$block' );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 
-				schema.allow( { name: '$text', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
 				schema.allow( { name: '$text', attributes: [ 'bold', 'italic' ] } );
 			} );
 
@@ -170,18 +170,18 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'image', '$inline' );
-				schema.registerItem( 'pchild' );
-				schema.registerItem( 'pparent' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
+				schema.register( 'pchild' );
+				schema.register( 'pparent' );
 
-				schema.allow( { name: 'pchild', inside: 'paragraph' } );
-				schema.allow( { name: '$text', inside: 'pchild' } );
+				schema.extend( 'pchild', { allowIn: 'paragraph' } );
+				schema.extend( '$text', { allowIn: 'pchild' } );
 
-				schema.allow( { name: 'paragraph', inside: 'pparent' } );
-				schema.allow( { name: 'pparent', inside: '$root' } );
-				schema.allow( { name: '$text', inside: 'pparent' } );
+				schema.extend( 'paragraph', { allowIn: 'pparent' } );
+				schema.extend( 'pparent', { allowIn: '$root' } );
+				schema.extend( '$text', { allowIn: 'pparent' } );
 
 				schema.allow( { name: 'paragraph', attributes: [ 'align' ] } );
 			} );
@@ -440,16 +440,17 @@ describe( 'DataController utils', () => {
 				beforeEach( () => {
 					const schema = model.schema;
 
-					schema.registerItem( 'blockWidget' );
-					schema.registerItem( 'nestedEditable' );
+					schema.register( 'blockWidget', {
+						isObject: true
+					} );
+					schema.register( 'nestedEditable', {
+						isLimit: true
+					} );
 
-					schema.allow( { name: 'blockWidget', inside: '$root' } );
+					schema.extend( 'blockWidget', { allowIn: '$root' } );
 
-					schema.allow( { name: 'nestedEditable', inside: 'blockWidget' } );
-					schema.allow( { name: '$text', inside: 'nestedEditable' } );
-
-					schema.objects.add( 'blockWidget' );
-					schema.limits.add( 'nestedEditable' );
+					schema.extend( 'nestedEditable', { allowIn: 'blockWidget' } );
+					schema.extend( '$text', { allowIn: 'nestedEditable' } );
 				} );
 
 				test(
@@ -471,7 +472,7 @@ describe( 'DataController utils', () => {
 
 					schema.allow( { name: '$text', attributes: [ 'a', 'b' ], inside: 'paragraph' } );
 					schema.allow( { name: '$text', attributes: [ 'b', 'c' ], inside: 'pchild' } );
-					schema.allow( { name: 'pchild', inside: 'pchild' } );
+					schema.extend( 'pchild', { allowIn: 'pchild' } );
 					schema.disallow( { name: '$text', attributes: [ 'c' ], inside: 'pchild pchild' } );
 				} );
 
@@ -525,24 +526,26 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.limits.add( 'restrictedRoot' );
-
-				schema.registerItem( 'image', '$inline' );
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'blockWidget' );
-				schema.registerItem( 'restrictedRoot' );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'blockWidget' );
+				schema.register( 'restrictedRoot', {
+					isLimit: true
+				} );
 
-				schema.allow( { name: '$block', inside: '$root' } );
-				schema.allow( { name: 'blockWidget', inside: '$root' } );
+				schema.extend( '$block', { allowIn: '$root' } );
+				schema.extend( 'blockWidget', { allowIn: '$root' } );
 
-				schema.allow( { name: 'blockWidget', inside: 'restrictedRoot' } );
+				schema.extend( 'blockWidget', { allowIn: 'restrictedRoot' } );
 			} );
 
 			// See also "in simple scenarios => deletes an element".
 
 			it( 'deletes two inline elements', () => {
-				model.schema.limits.add( 'paragraph' );
+				model.schema.extend( 'paragraph', {
+					isLimit: true
+				} );
 
 				setData(
 					model,
@@ -643,16 +646,17 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'inlineLimit' );
-				schema.allow( { name: 'inlineLimit', inside: '$root' } );
-				schema.allow( { name: '$text', inside: 'inlineLimit' } );
-				schema.limits.add( 'inlineLimit' );
+				schema.register( 'inlineLimit', {
+					isLimit: true
+				} );
+				schema.extend( 'inlineLimit', { allowIn: '$root' } );
+				schema.extend( '$text', { allowIn: 'inlineLimit' } );
 
-				schema.allow( { name: '$inline', inside: '$root' } );
+				schema.extend( '$inline', { allowIn: '$root' } );
 
-				schema.registerItem( 'x' );
-				schema.allow( { name: '$text', inside: 'x' } );
-				schema.allow( { name: 'x', inside: '$root' } );
+				schema.register( 'x' );
+				schema.extend( '$text', { allowIn: 'x' } );
+				schema.extend( 'x', { allowIn: '$root' } );
 			} );
 
 			test(
@@ -700,12 +704,13 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'blockLimit' );
-				schema.allow( { name: 'blockLimit', inside: '$root' } );
-				schema.allow( { name: '$block', inside: 'blockLimit' } );
-				schema.limits.add( 'blockLimit' );
+				schema.register( 'blockLimit', {
+					isLimit: true
+				} );
+				schema.extend( 'blockLimit', { allowIn: '$root' } );
+				schema.extend( '$block', { allowIn: 'blockLimit' } );
 
-				schema.registerItem( 'paragraph', '$block' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 			} );
 
 			test(
@@ -748,27 +753,33 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'div', '$block' );
-				schema.limits.add( 'div' );
+				schema.register( 'div', {
+					inheritAllFrom: '$block',
+					isLimit: true
+				} );
 
-				schema.registerItem( 'article', '$block' );
-				schema.limits.add( 'article' );
+				schema.register( 'article', {
+					inheritAllFrom: '$block',
+					isLimit: true
+				} );
 
-				schema.registerItem( 'image', '$inline' );
-				schema.objects.add( 'image' );
+				schema.register( 'image', {
+					inheritAllFrom: '$inline',
+					isObject: true
+				} );
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'heading2', '$block' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'heading2', { inheritAllFrom: '$block' } );
 
-				schema.allow( { name: '$text', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
 
-				schema.allow( { name: 'image', inside: '$root' } );
-				schema.allow( { name: 'image', inside: 'heading1' } );
-				schema.allow( { name: 'heading1', inside: 'div' } );
-				schema.allow( { name: 'paragraph', inside: 'div' } );
-				schema.allow( { name: 'heading1', inside: 'article' } );
-				schema.allow( { name: 'heading2', inside: 'article' } );
+				schema.extend( 'image', { allowIn: '$root' } );
+				schema.extend( 'image', { allowIn: 'heading1' } );
+				schema.extend( 'heading1', { allowIn: 'div' } );
+				schema.extend( 'paragraph', { allowIn: 'div' } );
+				schema.extend( 'heading1', { allowIn: 'article' } );
+				schema.extend( 'heading2', { allowIn: 'article' } );
 			} );
 
 			test(

+ 19 - 19
packages/ckeditor5-engine/tests/model/utils/getselectedcontent.js

@@ -17,7 +17,7 @@ describe( 'DataController utils', () => {
 			doc = model.document;
 			doc.createRoot();
 
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 			setData( model, 'x[abc]x' );
 
 			model.change( writer => {
@@ -34,10 +34,10 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'image', '$inline' );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
 
-				schema.allow( { name: '$text', inside: '$root' } );
-				schema.allow( { name: 'image', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
+				schema.extend( 'image', { allowIn: '$root' } );
 				schema.allow( { name: '$inline', attributes: [ 'bold' ] } );
 				schema.allow( { name: '$inline', attributes: [ 'italic' ] } );
 			} );
@@ -128,15 +128,15 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'blockImage' );
-				schema.registerItem( 'caption' );
-				schema.registerItem( 'image', '$inline' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'blockImage' );
+				schema.register( 'caption' );
+				schema.register( 'image', { inheritAllFrom: '$inline' } );
 
-				schema.allow( { name: 'blockImage', inside: '$root' } );
-				schema.allow( { name: 'caption', inside: 'blockImage' } );
-				schema.allow( { name: '$inline', inside: 'caption' } );
+				schema.extend( 'blockImage', { allowIn: '$root' } );
+				schema.extend( 'caption', { allowIn: 'blockImage' } );
+				schema.extend( '$inline', { allowIn: 'caption' } );
 
 				schema.allow( { name: '$inline', attributes: [ 'bold' ] } );
 			} );
@@ -268,12 +268,12 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'quote' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'quote' );
 
-				schema.allow( { name: '$block', inside: 'quote' } );
-				schema.allow( { name: 'quote', inside: '$root' } );
+				schema.extend( '$block', { allowIn: 'quote' } );
+				schema.extend( 'quote', { allowIn: '$root' } );
 			} );
 
 			it( 'gets content when ends are equally deeply nested', () => {
@@ -329,8 +329,8 @@ describe( 'DataController utils', () => {
 
 			// See: https://github.com/ckeditor/ckeditor5-engine/pull/1043#issuecomment-318012286
 			it( 'ensures that elements are retrieved by indexes instead of offsets', () => {
-				model.schema.allow( { name: '$text', inside: '$root' } );
-				model.schema.allow( { name: '$text', inside: 'quote' } );
+				model.schema.extend( '$text', { allowIn: '$root' } );
+				model.schema.extend( '$text', { allowIn: 'quote' } );
 
 				setData( model,
 					'foo' +

+ 57 - 51
packages/ckeditor5-engine/tests/model/utils/insertcontent.js

@@ -20,7 +20,7 @@ describe( 'DataController utils', () => {
 			doc = model.document;
 			doc.createRoot();
 
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 			setData( model, 'x[]x' );
 
 			model.change( writer => {
@@ -34,7 +34,7 @@ describe( 'DataController utils', () => {
 			doc = model.document;
 			doc.createRoot();
 
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 
 			setData( model, 'x[]x' );
 
@@ -48,7 +48,7 @@ describe( 'DataController utils', () => {
 			doc = model.document;
 			doc.createRoot();
 
-			model.schema.allow( { name: '$text', inside: '$root' } );
+			model.schema.extend( '$text', { allowIn: '$root' } );
 
 			setData( model, 'x[]x' );
 
@@ -64,9 +64,11 @@ describe( 'DataController utils', () => {
 
 			const content = new Element( 'image' );
 
-			model.schema.registerItem( 'paragraph', '$block' );
-			model.schema.registerItem( 'image', '$inline' );
-			model.schema.objects.add( 'image' );
+			model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+			model.schema.register( 'image', {
+				inheritAllFrom: '$inline',
+				isObject: true
+			} );
 
 			setData( model, '<paragraph>foo[]</paragraph>' );
 
@@ -83,19 +85,20 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'image', '$inline' );
-				schema.registerItem( 'disallowedElement' );
+				schema.register( 'image', {
+					inheritAllFrom: '$inline',
+					isObject: true
+				} );
+				schema.register( 'disallowedElement' );
 
-				schema.allow( { name: '$text', inside: '$root' } );
-				schema.allow( { name: 'image', inside: '$root' } );
+				schema.extend( '$text', { allowIn: '$root' } );
+				schema.extend( 'image', { allowIn: '$root' } );
 				// Otherwise it won't be passed to the temporary model fragment used inside insert().
-				schema.allow( { name: 'disallowedElement', inside: '$clipboardHolder' } );
-				model.schema.allow( { name: '$text', inside: 'disallowedElement' } );
+				schema.extend( 'disallowedElement', { allowIn: '$clipboardHolder' } );
+				model.schema.extend( '$text', { allowIn: 'disallowedElement' } );
 
 				schema.allow( { name: '$inline', attributes: [ 'bold' ] } );
 				schema.allow( { name: '$inline', attributes: [ 'italic' ] } );
-
-				schema.objects.add( 'image' );
 			} );
 
 			it( 'inserts one text node', () => {
@@ -213,25 +216,26 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'heading2', '$block' );
-				schema.registerItem( 'blockWidget' );
-				schema.registerItem( 'inlineWidget' );
-				schema.registerItem( 'listItem', '$block' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'heading2', { inheritAllFrom: '$block' } );
+				schema.register( 'blockWidget', {
+					isObject: true
+				} );
+				schema.register( 'inlineWidget', {
+					isObject: true
+				} );
+				schema.register( 'listItem', { inheritAllFrom: '$block' } );
 
-				schema.allow( { name: 'blockWidget', inside: '$root' } );
-				schema.allow( { name: 'inlineWidget', inside: '$block' } );
-				schema.allow( { name: 'inlineWidget', inside: '$clipboardHolder' } );
+				schema.extend( 'blockWidget', { allowIn: '$root' } );
+				schema.extend( 'inlineWidget', { allowIn: '$block' } );
+				schema.extend( 'inlineWidget', { allowIn: '$clipboardHolder' } );
 				schema.allow( {
 					name: 'listItem',
 					inside: '$root',
 					attributes: [ 'type', 'indent' ]
 				} );
 				schema.requireAttributes( 'listItem', [ 'type', 'indent' ] );
-
-				schema.objects.add( 'blockWidget' );
-				schema.objects.add( 'inlineWidget' );
 			} );
 
 			it( 'inserts one text node', () => {
@@ -585,28 +589,29 @@ describe( 'DataController utils', () => {
 
 				const schema = model.schema;
 
-				schema.registerItem( 'paragraph', '$block' );
-				schema.registerItem( 'heading1', '$block' );
-				schema.registerItem( 'element', '$block' );
+				schema.register( 'paragraph', { inheritAllFrom: '$block' } );
+				schema.register( 'heading1', { inheritAllFrom: '$block' } );
+				schema.register( 'element', { inheritAllFrom: '$block' } );
 
-				schema.registerItem( 'table' );
-				schema.registerItem( 'td' );
-				schema.registerItem( 'disallowedWidget' );
+				schema.register( 'table' );
+				schema.register( 'td' );
+				schema.register( 'disallowedWidget', {
+					isObject: true
+				} );
 
-				schema.allow( { name: 'table', inside: '$clipboardHolder' } );
-				schema.allow( { name: 'td', inside: '$clipboardHolder' } );
-				schema.allow( { name: 'td', inside: 'table' } );
-				schema.allow( { name: 'element', inside: 'td' } );
-				schema.allow( { name: '$block', inside: 'td' } );
-				schema.allow( { name: '$text', inside: 'td' } );
-				schema.allow( { name: 'table', inside: 'element' } );
+				schema.extend( 'table', { allowIn: '$clipboardHolder' } );
+				schema.extend( 'td', { allowIn: '$clipboardHolder' } );
+				schema.extend( 'td', { allowIn: 'table' } );
+				schema.extend( 'element', { allowIn: 'td' } );
+				schema.extend( '$block', { allowIn: 'td' } );
+				schema.extend( '$text', { allowIn: 'td' } );
+				schema.extend( 'table', { allowIn: 'element' } );
 
-				schema.allow( { name: 'disallowedWidget', inside: '$clipboardHolder' } );
-				schema.allow( { name: '$text', inside: 'disallowedWidget' } );
-				schema.objects.add( 'disallowedWidget' );
+				schema.extend( 'disallowedWidget', { allowIn: '$clipboardHolder' } );
+				schema.extend( '$text', { allowIn: 'disallowedWidget' } );
 
-				schema.allow( { name: 'element', inside: 'paragraph' } );
-				schema.allow( { name: 'element', inside: 'heading1' } );
+				schema.extend( 'element', { allowIn: 'paragraph' } );
+				schema.extend( 'element', { allowIn: 'heading1' } );
 				schema.allow( { name: '$text', attributes: 'b', inside: 'paragraph' } );
 				schema.allow( { name: '$text', attributes: [ 'b' ], inside: 'paragraph element' } );
 				schema.allow( { name: '$text', attributes: [ 'a', 'b' ], inside: 'heading1 element' } );
@@ -691,15 +696,16 @@ describe( 'DataController utils', () => {
 
 			const schema = model.schema;
 
-			schema.registerItem( 'limit' );
-			schema.allow( { name: 'limit', inside: '$root' } );
-			schema.allow( { name: '$text', inside: 'limit' } );
-			schema.limits.add( 'limit' );
+			schema.register( 'limit', {
+				isLimit: true
+			} );
+			schema.extend( 'limit', { allowIn: '$root' } );
+			schema.extend( '$text', { allowIn: 'limit' } );
 
-			schema.registerItem( 'disallowedElement' );
-			schema.allow( { name: 'disallowedElement', inside: '$clipboardHolder' } );
+			schema.register( 'disallowedElement' );
+			schema.extend( 'disallowedElement', { allowIn: '$clipboardHolder' } );
 
-			schema.registerItem( 'paragraph', '$block' );
+			schema.register( 'paragraph', { inheritAllFrom: '$block' } );
 		} );
 
 		it( 'should insert limit element', () => {

+ 28 - 24
packages/ckeditor5-engine/tests/model/utils/modifyselection.js

@@ -15,9 +15,9 @@ describe( 'DataController utils', () => {
 		model = new Model();
 		doc = model.document;
 
-		model.schema.registerItem( 'p', '$block' );
-		model.schema.registerItem( 'x', '$block' );
-		model.schema.allow( { name: 'x', inside: 'p' } );
+		model.schema.register( 'p', { inheritAllFrom: '$block' } );
+		model.schema.register( 'x', { inheritAllFrom: '$block' } );
+		model.schema.extend( 'x', { allowIn: 'p' } );
 
 		doc.createRoot();
 	} );
@@ -287,9 +287,9 @@ describe( 'DataController utils', () => {
 
 			describe( 'beyond element – skipping incorrect positions', () => {
 				beforeEach( () => {
-					model.schema.registerItem( 'quote' );
-					model.schema.allow( { name: 'quote', inside: '$root' } );
-					model.schema.allow( { name: '$block', inside: 'quote' } );
+					model.schema.register( 'quote' );
+					model.schema.extend( 'quote', { allowIn: '$root' } );
+					model.schema.extend( '$block', { allowIn: 'quote' } );
 				} );
 
 				test(
@@ -335,7 +335,7 @@ describe( 'DataController utils', () => {
 
 		describe( 'unit=codePoint', () => {
 			it( 'does nothing on empty content', () => {
-				model.schema.allow( { name: '$text', inside: '$root' } );
+				model.schema.extend( '$text', { allowIn: '$root' } );
 
 				setData( model, '' );
 
@@ -413,14 +413,17 @@ describe( 'DataController utils', () => {
 
 		describe( 'objects handling', () => {
 			beforeEach( () => {
-				model.schema.registerItem( 'obj' );
-				model.schema.allow( { name: 'obj', inside: '$root' } );
-				model.schema.allow( { name: '$text', inside: 'obj' } );
-				model.schema.objects.add( 'obj' );
-
-				model.schema.registerItem( 'inlineObj', '$inline' );
-				model.schema.allow( { name: '$text', inside: 'inlineObj' } );
-				model.schema.objects.add( 'inlineObj' );
+				model.schema.register( 'obj', {
+					isObject: true
+				} );
+				model.schema.extend( 'obj', { allowIn: '$root' } );
+				model.schema.extend( '$text', { allowIn: 'obj' } );
+
+				model.schema.register( 'inlineObj', {
+					inheritAllFrom: '$inline',
+					isObject: true
+				} );
+				model.schema.extend( '$text', { allowIn: 'inlineObj' } );
 			} );
 
 			test(
@@ -480,16 +483,17 @@ describe( 'DataController utils', () => {
 
 		describe( 'limits handling', () => {
 			beforeEach( () => {
-				model.schema.registerItem( 'inlineLimit' );
-				model.schema.allow( { name: 'inlineLimit', inside: '$block' } );
-				model.schema.allow( { name: '$text', inside: 'inlineLimit' } );
-
-				model.schema.registerItem( 'blockLimit' );
-				model.schema.allow( { name: 'blockLimit', inside: '$root' } );
-				model.schema.allow( { name: 'p', inside: 'blockLimit' } );
+				model.schema.register( 'inlineLimit', {
+					isLimit: true
+				} );
+				model.schema.extend( 'inlineLimit', { allowIn: '$block' } );
+				model.schema.extend( '$text', { allowIn: 'inlineLimit' } );
 
-				model.schema.limits.add( 'inlineLimit' );
-				model.schema.limits.add( 'blockLimit' );
+				model.schema.register( 'blockLimit', {
+					isLimit: true
+				} );
+				model.schema.extend( 'blockLimit', { allowIn: '$root' } );
+				model.schema.extend( 'p', { allowIn: 'blockLimit' } );
 			} );
 
 			test(

+ 4 - 3
packages/ckeditor5-engine/tests/tickets/699.js

@@ -44,9 +44,10 @@ describe( 'Bug ckeditor5-engine#699', () => {
 function WidgetPlugin( editor ) {
 	const schema = editor.model.schema;
 
-	schema.registerItem( 'widget' );
-	schema.allow( { name: 'widget', inside: '$root' } );
-	schema.objects.add( 'widget' );
+	schema.register( 'widget', {
+		isObject: true
+	} );
+	schema.extend( 'widget', { allowIn: '$root' } );
 
 	buildModelConverter().for( editor.data.modelToView, editor.editing.modelToView )
 		.fromElement( 'widget' )