From 075ee1e441e389e14e56b1ce20b76e4ceb6e5720 Mon Sep 17 00:00:00 2001 From: Mateusz Baginski Date: Wed, 18 Sep 2024 12:31:25 +0200 Subject: [PATCH 1/3] Debounce infinite loop selection check due to selection batching changes --- .../tests/view/observer/selectionobserver.js | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js index 31ff2e5c0c4..52d491468b7 100644 --- a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js +++ b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js @@ -298,9 +298,7 @@ describe( 'SelectionObserver', () => { domSelection.collapse( editable, 0 ); } ); - it( 'should not enter infinite loop', () => { - let counter = 70; - + it( 'should not enter infinite loop', async () => { const viewFoo = viewDocument.getRoot().getChild( 0 ).getChild( 0 ); view.change( writer => { writer.setSelection( viewFoo, 0 ); @@ -315,6 +313,17 @@ describe( 'SelectionObserver', () => { selectionObserver._clearInfiniteLoop(); viewDocument.on( 'selectionChange', selectionChangeSpy ); + let counter = 70; + + const simulateSelectionChanges = () => { + changeDomSelection(); + counter--; + + if ( counter > 0 ) { + setTimeout( simulateSelectionChanges, 10 ); + } + }; + return new Promise( resolve => { viewDocument.on( 'selectionChangeDone', () => { expect( wasInfiniteLoopDetected ).to.be.true; @@ -323,10 +332,7 @@ describe( 'SelectionObserver', () => { resolve(); } ); - while ( counter > 0 ) { - changeDomSelection(); - counter--; - } + simulateSelectionChanges(); } ); } ); @@ -775,4 +781,8 @@ describe( 'SelectionObserver', () => { domSelection.collapse( domFoo, offset == 2 ? 3 : 2 ); } + + function timeout( ms ) { + return new Promise( resolve => setTimeout( resolve, ms ) ); + } } ); From ab036a3a9a25df60d232e5cae7c86b0a1cc52201 Mon Sep 17 00:00:00 2001 From: Mateusz Baginski Date: Wed, 18 Sep 2024 12:33:00 +0200 Subject: [PATCH 2/3] Adjust test --- .../tests/view/observer/selectionobserver.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js index 52d491468b7..8d05ff6ef09 100644 --- a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js +++ b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js @@ -298,7 +298,7 @@ describe( 'SelectionObserver', () => { domSelection.collapse( editable, 0 ); } ); - it( 'should not enter infinite loop', async () => { + it( 'should not enter infinite loop', () => { const viewFoo = viewDocument.getRoot().getChild( 0 ).getChild( 0 ); view.change( writer => { writer.setSelection( viewFoo, 0 ); @@ -781,8 +781,4 @@ describe( 'SelectionObserver', () => { domSelection.collapse( domFoo, offset == 2 ? 3 : 2 ); } - - function timeout( ms ) { - return new Promise( resolve => setTimeout( resolve, ms ) ); - } } ); From b30cfbcbe3fdc06b745de8ef884eac9c109758df Mon Sep 17 00:00:00 2001 From: Mateusz Baginski Date: Thu, 19 Sep 2024 07:25:57 +0200 Subject: [PATCH 3/3] Fix potential memory leak in test --- .../tests/view/observer/selectionobserver.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js index 8d05ff6ef09..1fff8a99668 100644 --- a/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js +++ b/packages/ckeditor5-engine/tests/view/observer/selectionobserver.js @@ -316,12 +316,14 @@ describe( 'SelectionObserver', () => { let counter = 70; const simulateSelectionChanges = () => { + if ( !counter ) { + return; + } + changeDomSelection(); counter--; - if ( counter > 0 ) { - setTimeout( simulateSelectionChanges, 10 ); - } + setTimeout( simulateSelectionChanges, 10 ); }; return new Promise( resolve => { @@ -329,6 +331,7 @@ describe( 'SelectionObserver', () => { expect( wasInfiniteLoopDetected ).to.be.true; expect( selectionChangeSpy.callCount ).to.equal( 60 ); + counter = 0; resolve(); } );