8
0
Pārlūkot izejas kodu

Added tests to selecting all content.

Szymon Kupś 8 gadi atpakaļ
vecāks
revīzija
2b621e0216

+ 12 - 2
packages/ckeditor5-widget/src/widget.js

@@ -266,18 +266,28 @@ export default class Widget extends Plugin {
 		return true;
 	}
 
+	/**
+	 * Handles <kbd>CTRL + A</kbd> when widget is selected.
+	 *
+	 * @private
+	 * @returns {Boolean} Returns true if widget was selected and selecting all was handled by this method.
+	 */
 	_selectAllContent() {
 		const modelDocument = this.editor.document;
 		const modelSelection = modelDocument.selection;
-		const viewDocument = this.editor.editing.view;
+		const editing = this.editor.editing;
+		const viewDocument = editing.view;
 		const viewSelection = viewDocument.selection;
 
 		const selectedElement = viewSelection.getSelectedElement();
 
 		// Only widget is selected.
+		// https://github.com/ckeditor/ckeditor5-widget/issues/23
 		if ( selectedElement && isWidget( selectedElement ) ) {
+			const widgetParent = editing.mapper.toModelElement( selectedElement.parent );
+
 			modelDocument.enqueueChanges( () => {
-				modelSelection.setRanges( [ ModelRange.createIn( modelDocument.getRoot() ) ] );
+				modelSelection.setRanges( [ ModelRange.createIn( widgetParent ) ] );
 			} );
 
 			return true;

+ 27 - 1
packages/ckeditor5-widget/tests/widget.js

@@ -196,6 +196,19 @@ describe( 'Widget', () => {
 		expect( viewDocument.selection.fakeSelectionLabel ).to.equal( 'element label' );
 	} );
 
+	it( 'should add selected class when no only a widget is selected', () => {
+		setModelData( doc, '[<paragraph>foo</paragraph><widget></widget><widget></widget>]' );
+
+		expect( viewDocument.selection.isFake ).to.be.false;
+		expect( getViewData( viewDocument ) ).to.equal(
+			'[' +
+			'<p>foo</p>' +
+			'<div class="ck-widget ck-widget_selected" contenteditable="false"><b></b></div>' +
+			'<div class="ck-widget ck-widget_selected" contenteditable="false"><b></b></div>' +
+			']'
+		);
+	} );
+
 	it( 'fake selection should be empty if widget is not selected', () => {
 		setModelData( doc, '<paragraph>foo</paragraph><widget>foo bar</widget>' );
 
@@ -1075,9 +1088,18 @@ describe( 'Widget', () => {
 				{ keyCode: keyCodes.a, ctrlKey: true },
 				'<widget><nested>foo</nested></widget><paragraph>[]bar</paragraph>'
 			);
+
+			test(
+				'should selected whole content when widget is selected',
+				'<paragraph>foo</paragraph>[<widget></widget>]<paragraph>bar</paragraph>',
+				{ keyCode: keyCodes.a, ctrlKey: true },
+				'[<paragraph>foo</paragraph><widget></widget><paragraph>bar</paragraph>]',
+				'[<p>foo</p><div class="ck-widget ck-widget_selected" contenteditable="false"><b></b></div><p>bar</p>]'
+
+			);
 		} );
 
-		function test( name, data, keyCodeOrMock, expected ) {
+		function test( name, data, keyCodeOrMock, expected, expectedView ) {
 			it( name, () => {
 				const domEventDataMock = ( typeof keyCodeOrMock == 'object' ) ? keyCodeOrMock : {
 					keyCode: keyCodeOrMock
@@ -1091,6 +1113,10 @@ describe( 'Widget', () => {
 				) );
 
 				expect( getModelData( doc ) ).to.equal( expected );
+
+				if ( expectedView ) {
+					expect( getViewData( viewDocument ) ).to.equal( expectedView );
+				}
 			} );
 		}
 	} );