From dbc4cb27997887e176a5b795ac957c2f92b7f353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szymon=20Kup=C5=9B?= Date: Tue, 20 Feb 2018 16:55:37 +0100 Subject: [PATCH] Updating balloon position after DOM is rendered. --- src/link.js | 3 ++- tests/link.js | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/link.js b/src/link.js index 8e72ba4..6153b7e 100644 --- a/src/link.js +++ b/src/link.js @@ -369,6 +369,7 @@ export default class Link extends Plugin { let prevSelectedLink = this._getSelectedLinkElement(); let prevSelectionParent = getSelectionParent(); + // Use 'low' priority to update position after view is rendered to the DOM. this.listenTo( editingView, 'render', () => { const selectedLink = this._getSelectedLinkElement(); const selectionParent = getSelectionParent(); @@ -399,7 +400,7 @@ export default class Link extends Plugin { prevSelectedLink = selectedLink; prevSelectionParent = selectionParent; - } ); + }, { priority: 'low' } ); function getSelectionParent() { return editingView.document.selection.focus.getAncestors() diff --git a/tests/link.js b/tests/link.js index 7edf3b0..1fcbbf7 100644 --- a/tests/link.js +++ b/tests/link.js @@ -20,6 +20,7 @@ import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview'; import Range from '@ckeditor/ckeditor5-engine/src/view/range'; import ClickObserver from '@ckeditor/ckeditor5-engine/src/view/observer/clickobserver'; +import priorities from '@ckeditor/ckeditor5-utils/src/priorities'; testUtils.createSinonSandbox(); @@ -235,7 +236,7 @@ describe( 'Link', () => { viewDocument = view.document; } ); - it( 'should not duplicate #change listeners', () => { + it( 'should not duplicate #render listeners', () => { setModelData( editor.model, 'f[]oo' ); const spy = testUtils.sinon.stub( balloon, 'updatePosition' ).returns( {} ); @@ -249,6 +250,21 @@ describe( 'Link', () => { sinon.assert.calledTwice( spy ); } ); + it( 'should update position on #render with low priority', () => { + setModelData( editor.model, 'f[]oo' ); + linkFeature._showUI(); + + const spyBefore = sinon.spy(); + const spy = sinon.spy( balloon, 'updatePosition' ); + const spyAfter = sinon.spy(); + + view.on( 'render', spyBefore, { priority: priorities.get( 'low' ) + 1 } ); + view.on( 'render', spyAfter, { priority: 'low' } ); + view.fire( 'render' ); + + sinon.assert.callOrder( spyBefore, spy, spyAfter ); + } ); + // https://github.com/ckeditor/ckeditor5-link/issues/113 it( 'updates the position of the panel – editing a link, then the selection remains in the link', () => { setModelData( editor.model, '<$text linkHref="url">f[]oo' );