From 280de3688e0a0abe64d1f0ecf6a935b1005bcb1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Wr=C3=B3bel?= Date: Mon, 18 Feb 2019 16:01:27 +0100 Subject: [PATCH] Prevented from changing view document during the render phase. --- src/editableui/editableuiview.js | 18 +++++++++++++----- tests/editableui/editableuiview.js | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/editableui/editableuiview.js b/src/editableui/editableuiview.js index 3d1325b1..0531445b 100644 --- a/src/editableui/editableuiview.js +++ b/src/editableui/editableuiview.js @@ -121,11 +121,19 @@ export default class EditableUIView extends View { _updateIsFocusedClasses() { const editingView = this._editingView; - editingView.change( writer => { - const viewRoot = editingView.document.getRoot( this.name ); + if ( editingView.isRenderingInProgress ) { + editingView.once( 'change:isRenderingInProgress', () => update( this ) ); + } else { + update( this ); + } - writer.addClass( this.isFocused ? 'ck-focused' : 'ck-blurred', viewRoot ); - writer.removeClass( this.isFocused ? 'ck-blurred' : 'ck-focused', viewRoot ); - } ); + function update( view ) { + editingView.change( writer => { + const viewRoot = editingView.document.getRoot( view.name ); + + writer.addClass( view.isFocused ? 'ck-focused' : 'ck-blurred', viewRoot ); + writer.removeClass( view.isFocused ? 'ck-blurred' : 'ck-focused', viewRoot ); + } ); + } } } diff --git a/tests/editableui/editableuiview.js b/tests/editableui/editableuiview.js index 3afdaf07..5d15dbf2 100644 --- a/tests/editableui/editableuiview.js +++ b/tests/editableui/editableuiview.js @@ -78,6 +78,25 @@ describe( 'EditableUIView', () => { expect( editingViewRoot.hasClass( 'ck-focused' ) ).to.be.false; expect( editingViewRoot.hasClass( 'ck-blurred' ) ).to.be.true; } ); + + // https://github.com/ckeditor/ckeditor5/issues/1530. + it( 'should work when update is handled during the rendering phase', () => { + view.isFocused = true; + editingView.isRenderingInProgress = true; + + expect( editingViewRoot.hasClass( 'ck-focused' ) ).to.be.true; + expect( editingViewRoot.hasClass( 'ck-blurred' ) ).to.be.false; + + view.isFocused = false; + + expect( editingViewRoot.hasClass( 'ck-focused' ) ).to.be.true; + expect( editingViewRoot.hasClass( 'ck-blurred' ) ).to.be.false; + + editingView.isRenderingInProgress = false; + + expect( editingViewRoot.hasClass( 'ck-focused' ) ).to.be.false; + expect( editingViewRoot.hasClass( 'ck-blurred' ) ).to.be.true; + } ); } ); } );