ソースを参照

Tests: Added tests for the selectionRootObtainer helper.

Aleksander Nowodzinski 8 年 前
コミット
1557bb167e

+ 10 - 2
packages/ckeditor5-ui/src/selectionrootobtainer.js

@@ -7,10 +7,18 @@
  * @module ui/selectionrootobtainer
  */
 
+/**
+ * Returns a function, which obtains the farthest DOM
+ * {@link module:engine/view/rooteditableelement~RootEditableElement}
+ * of the {@link module:engine/view/document~Document#selection}.
+ *
+ * @param {module:core/editor/editor~Editor} editor Editor instance.
+ * @returns {Function}
+ */
 export default function selectionRootObtainer( editor ) {
 	return () => {
-		const viewDocument = editor.editing.view;
+		const view = editor.editing.view;
 
-		return viewDocument.domConverter.mapViewToDom( viewDocument.selection.editableElement.root );
+		return view.domConverter.mapViewToDom( view.selection.editableElement.root );
 	};
 }

+ 73 - 0
packages/ckeditor5-ui/tests/selectionrootobtainer.js

@@ -0,0 +1,73 @@
+/**
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* global document */
+
+import Widget from '@ckeditor/ckeditor5-widget/src/widget';
+import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
+import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
+import selectionRootObtainer from '../src/selectionrootobtainer.js';
+import ViewContainerElement from '@ckeditor/ckeditor5-engine/src/view/containerelement';
+import ViewEditableElement from '@ckeditor/ckeditor5-engine/src/view/editableelement';
+import buildModelConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildmodelconverter';
+import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
+
+describe( 'selectionRootObtainer()', () => {
+	let editor, editorElement, doc, root, viewDocument;
+
+	beforeEach( () => {
+		editorElement = document.createElement( 'div' );
+		document.body.appendChild( editorElement );
+
+		return ClassicTestEditor
+			.create( editorElement, {
+				plugins: [ Paragraph, Widget ]
+			} )
+			.then( newEditor => {
+				editor = newEditor;
+				doc = editor.document;
+				viewDocument = editor.editing.view;
+				root = viewDocument.getRoot();
+			} );
+	} );
+
+	afterEach( () => {
+		editorElement.remove();
+		return editor.destroy();
+	} );
+
+	it( 'obtains the root of the selection', () => {
+		setModelData( doc, '<paragraph>[]bar</paragraph>' );
+
+		const obtainer = selectionRootObtainer( editor );
+
+		expect( obtainer() ).to.equal( viewDocument.domConverter.mapViewToDom( root ) );
+	} );
+
+	it( 'obtains the farthest root of the selection (nested editable)', () => {
+		doc.schema.registerItem( 'widget' );
+		doc.schema.registerItem( 'nestededitable' );
+
+		doc.schema.objects.add( 'widget' );
+
+		doc.schema.allow( { name: 'widget', inside: '$root' } );
+		doc.schema.allow( { name: 'nestededitable', inside: 'widget' } );
+		doc.schema.allow( { name: '$inline', inside: 'nestededitable' } );
+
+		buildModelConverter().for( editor.data.modelToView, editor.editing.modelToView )
+			.fromElement( 'widget' )
+			.toElement( () => new ViewContainerElement( 'figure', { contenteditable: 'false' } ) );
+
+		buildModelConverter().for( editor.data.modelToView, editor.editing.modelToView )
+			.fromElement( 'nestededitable' )
+			.toElement( () => new ViewEditableElement( 'figcaption', { contenteditable: 'true' } ) );
+
+		setModelData( doc, '<widget><nestededitable>[]foo</nestededitable></widget>' );
+
+		const obtainer = selectionRootObtainer( editor );
+
+		expect( obtainer() ).to.equal( viewDocument.domConverter.mapViewToDom( root ) );
+	} );
+} );