Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit 3b53d5a

Browse files
authored
Merge pull request #1679 from ckeditor/t/ckeditor5/1523
Fix: Fake selection container should be correctly appended to the new editable element when creating a new fake selection in a different editable element than the one which was focused before. Closes [ckeditor/ckeditor5#1523](ckeditor/ckeditor5#1523).
2 parents 6577d04 + 4dcbfa3 commit 3b53d5a

File tree

2 files changed

+37
-21
lines changed

2 files changed

+37
-21
lines changed

src/view/renderer.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,8 +707,7 @@ export default class Renderer {
707707
container.appendChild( domDocument.createTextNode( '\u00A0' ) );
708708
}
709709

710-
// Add fake container if not already added.
711-
if ( !container.parentElement ) {
710+
if ( !container.parentElement || container.parentElement != domRoot ) {
712711
domRoot.appendChild( container );
713712
}
714713

tests/view/renderer.js

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import View from '../../src/view/view';
99
import ViewElement from '../../src/view/element';
10+
import ViewEditableElement from '../../src/view/editableelement';
1011
import ViewContainerElement from '../../src/view/containerelement';
1112
import ViewAttributeElement from '../../src/view/attributeelement';
1213
import ViewText from '../../src/view/text';
@@ -112,10 +113,12 @@ describe( 'Renderer', () => {
112113
} );
113114

114115
describe( 'render', () => {
115-
let viewRoot, domRoot, selectionEditable;
116+
let viewRoot, domRoot;
116117

117118
beforeEach( () => {
118-
viewRoot = new ViewElement( 'div' );
119+
viewRoot = new ViewEditableElement( 'div' );
120+
viewRoot.getFillerOffset = () => null;
121+
119122
domRoot = document.createElement( 'div' );
120123
document.body.appendChild( domRoot );
121124

@@ -127,16 +130,7 @@ describe( 'Renderer', () => {
127130

128131
selection._setTo( null );
129132

130-
selectionEditable = viewRoot;
131-
132133
renderer.isFocused = true;
133-
134-
// Fake selection editable - it is needed to render selection properly.
135-
Object.defineProperty( selection, 'editableElement', {
136-
get() {
137-
return selectionEditable;
138-
}
139-
} );
140134
} );
141135

142136
afterEach( () => {
@@ -422,8 +416,6 @@ describe( 'Renderer', () => {
422416
} );
423417

424418
it( 'should not care about filler if there is no DOM', () => {
425-
selectionEditable = null;
426-
427419
const { view: viewP, selection: newSelection } = parse(
428420
'<container:p>foo<attribute:b>[]</attribute:b>bar</container:p>' );
429421

@@ -1202,11 +1194,10 @@ describe( 'Renderer', () => {
12021194
domSelection.removeAllRanges();
12031195
domSelection.collapse( domDiv, 0 );
12041196

1205-
selectionEditable = null;
1206-
1197+
const viewDiv = new ViewElement( 'div' );
12071198
const { view: viewP, selection: newSelection } = parse( '<container:p>fo{o}</container:p>' );
12081199

1209-
viewRoot._appendChild( viewP );
1200+
viewDiv._appendChild( viewP );
12101201
selection._setTo( newSelection );
12111202

12121203
renderer.render();
@@ -1353,13 +1344,13 @@ describe( 'Renderer', () => {
13531344
} );
13541345

13551346
it( 'should handle focusing element', () => {
1347+
selection._setTo( viewRoot, 0 );
1348+
13561349
const domFocusSpy = testUtils.sinon.spy( domRoot, 'focus' );
1357-
const editable = selection.editableElement;
13581350

13591351
renderer.render();
13601352

1361-
expect( editable ).to.equal( viewRoot );
1362-
expect( domFocusSpy.calledOnce ).to.be.true;
1353+
expect( domFocusSpy.called ).to.be.true;
13631354
} );
13641355

13651356
it( 'should not focus editable if isFocues is set to false', () => {
@@ -1928,6 +1919,32 @@ describe( 'Renderer', () => {
19281919
expect( container.style.left ).to.equal( '-9999px' );
19291920
} );
19301921

1922+
it( 'should move fake selection container between editables', () => {
1923+
const viewEditable = new ViewEditableElement( 'div' );
1924+
viewEditable._appendChild( parse( '<container:p>abc xyz</container:p>' ) );
1925+
1926+
const domEditable = document.createElement( 'div' );
1927+
1928+
document.body.appendChild( domEditable );
1929+
1930+
domConverter.bindElements( domEditable, viewEditable );
1931+
1932+
renderer.markToSync( 'children', viewEditable );
1933+
selection._setTo( selection.getRanges(), { fake: true, label: 'fake selection' } );
1934+
renderer.render();
1935+
1936+
let container = document.getSelection().anchorNode;
1937+
1938+
expect( domRoot.contains( container ) ).to.be.true;
1939+
1940+
selection._setTo( viewEditable, 'in', { fake: true, label: 'fake selection' } );
1941+
renderer.render();
1942+
1943+
container = document.getSelection().anchorNode;
1944+
1945+
expect( domEditable.contains( container ) ).to.be.true;
1946+
} );
1947+
19311948
it( 'should bind fake selection container to view selection', () => {
19321949
selection._setTo( selection.getRanges(), { fake: true, label: 'fake selection' } );
19331950
renderer.render();

0 commit comments

Comments
 (0)