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

Commit

Permalink
Merge pull request #40 from ckeditor/t/39
Browse files Browse the repository at this point in the history
Fix: LiveRanges used by InlineAutoFormatEngine are now properly detached. Closes #39.
  • Loading branch information
szymonkups committed Oct 17, 2017
2 parents dcb1c8f + bd68e72 commit 5f24ae8
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/inlineautoformatengine.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,16 @@ export default class InlineAutoformatEngine {
// Apply format.
formatCallback( fixBatch, validRanges );

// Detach ranges used to apply Autoformat. Prevents memory leaks. #39
rangesToFormat.forEach( range => range.detach() );

// Remove delimiters.
for ( const range of rangesToRemove ) {
fixBatch.remove( range );

// Prevents memory leaks.
// https://github.com/ckeditor/ckeditor5-autoformat/issues/39
range.detach();
}
} );
} );
Expand Down
27 changes: 27 additions & 0 deletions tests/inlineautoformatengine.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,32 @@ describe( 'InlineAutoformatEngine', () => {

sinon.assert.notCalled( formatSpy );
} );

it( 'should detach removed ranges', () => {
const detachSpies = [];
const callback = fixBatch => testUtils.sinon.stub( fixBatch, 'remove' ).callsFake( saveDetachSpy );
testUtils.sinon.stub( editor.document.schema, 'getValidRanges' )
.callThrough()
.callsFake( ranges => ranges.map( saveDetachSpy ) );

new InlineAutoformatEngine( editor, /(\*)(.+?)(\*)/g, callback ); // eslint-disable-line no-new

setData( doc, '<paragraph>*foobar[]</paragraph>' );

doc.enqueueChanges( () => {
doc.batch().insert( doc.selection.getFirstPosition(), '*' );
} );

// There should be two removed ranges and one range used to apply autoformat.
expect( detachSpies ).to.have.length( 3 );

for ( const spy of detachSpies ) {
testUtils.sinon.assert.calledOnce( spy );
}

function saveDetachSpy( range ) {
detachSpies.push( testUtils.sinon.spy( range, 'detach' ) );
}
} );
} );
} );

0 comments on commit 5f24ae8

Please sign in to comment.