diff --git a/src/link.js b/src/link.js index d5f6c28..ee1576a 100644 --- a/src/link.js +++ b/src/link.js @@ -225,7 +225,6 @@ export default class Link extends Plugin { * * @protected * @param {Boolean} [focusInput=false] When `true`, link form will be focused on panel show. - * @return {Promise} A promise resolved when the {@link #formView} {@link module:ui/view~View#init} is done. */ _showPanel( focusInput ) { const editor = this.editor; @@ -280,17 +279,15 @@ export default class Link extends Plugin { if ( focusInput && this._balloon.visibleView === this.formView ) { this.formView.urlInputView.select(); } - - return Promise.resolve(); } else { - return this._balloon.add( { + this._balloon.add( { view: this.formView, position: this._getBalloonPositionData() - } ).then( () => { - if ( focusInput ) { - this.formView.urlInputView.select(); - } } ); + + if ( focusInput ) { + this.formView.urlInputView.select(); + } } } diff --git a/tests/link.js b/tests/link.js index dc2117b..4a10ae2 100644 --- a/tests/link.js +++ b/tests/link.js @@ -46,7 +46,7 @@ describe( 'Link', () => { testUtils.sinon.stub( balloon.view, 'attachTo', () => {} ); testUtils.sinon.stub( balloon.view, 'pin', () => {} ); - return formView.init(); + formView.init(); } ); } ); @@ -80,48 +80,36 @@ describe( 'Link', () => { editor.editing.view.isFocused = true; } ); - it( 'should return promise', () => { - const returned = linkFeature._showPanel(); - - expect( returned ).to.instanceof( Promise ); - - return returned; - } ); - it( 'should add #formView to the #_balloon and attach the #_balloon to the selection when text fragment is selected', () => { setModelData( editor.document, 'f[o]o' ); const selectedRange = editorElement.ownerDocument.getSelection().getRangeAt( 0 ); - return linkFeature._showPanel() - .then( () => { - expect( balloon.visibleView ).to.equal( formView ); - - sinon.assert.calledWithExactly( balloonAddSpy, { - view: formView, - position: { - target: selectedRange, - limiter: editorElement - } - } ); - } ); + linkFeature._showPanel(); + + expect( balloon.visibleView ).to.equal( formView ); + sinon.assert.calledWithExactly( balloonAddSpy, { + view: formView, + position: { + target: selectedRange, + limiter: editorElement + } + } ); } ); it( 'should add #formView to the #_balloon and attach the #_balloon to the selection when selection is collapsed', () => { setModelData( editor.document, 'f[]oo' ); const selectedRange = editorElement.ownerDocument.getSelection().getRangeAt( 0 ); - return linkFeature._showPanel() - .then( () => { - expect( balloon.visibleView ).to.equal( formView ); - - sinon.assert.calledWithExactly( balloonAddSpy, { - view: formView, - position: { - target: selectedRange, - limiter: editorElement - } - } ); - } ); + linkFeature._showPanel(); + + expect( balloon.visibleView ).to.equal( formView ); + sinon.assert.calledWithExactly( balloonAddSpy, { + view: formView, + position: { + target: selectedRange, + limiter: editorElement + } + } ); } ); it( 'should add #formView to the #_balloon and attach the #_balloon to the link element when collapsed selection is inside ' + @@ -130,36 +118,30 @@ describe( 'Link', () => { setModelData( editor.document, '<$text linkHref="url">f[]oo' ); const linkElement = editorElement.querySelector( 'a' ); - return linkFeature._showPanel() - .then( () => { - expect( balloon.visibleView ).to.equal( formView ); - - sinon.assert.calledWithExactly( balloonAddSpy, { - view: formView, - position: { - target: linkElement, - limiter: editorElement - } - } ); - } ); + linkFeature._showPanel(); + + expect( balloon.visibleView ).to.equal( formView ); + sinon.assert.calledWithExactly( balloonAddSpy, { + view: formView, + position: { + target: linkElement, + limiter: editorElement + } + } ); } ); it( 'should not focus the #formView at default', () => { const spy = testUtils.sinon.spy( formView.urlInputView, 'select' ); - return linkFeature._showPanel() - .then( () => { - sinon.assert.notCalled( spy ); - } ); + linkFeature._showPanel(); + sinon.assert.notCalled( spy ); } ); it( 'should not focus the #formView when called with a `false` parameter', () => { const spy = testUtils.sinon.spy( formView.urlInputView, 'select' ); - return linkFeature._showPanel( false ) - .then( () => { - sinon.assert.notCalled( spy ); - } ); + linkFeature._showPanel( false ); + sinon.assert.notCalled( spy ); } ); it( 'should not focus the #formView when called with a `true` parameter while the balloon is opened but link ' + @@ -171,48 +153,39 @@ describe( 'Link', () => { destroy: () => {} }; - return linkFeature._showPanel( false ) - .then( () => balloon.add( { view: viewMock } ) ) - .then( () => linkFeature._showPanel( true ) ) - .then( () => { - sinon.assert.notCalled( spy ); - } ); + linkFeature._showPanel( false ); + balloon.add( { view: viewMock } ); + linkFeature._showPanel( true ); + + sinon.assert.notCalled( spy ); } ); it( 'should focus the #formView when called with a `true` parameter', () => { const spy = testUtils.sinon.spy( formView.urlInputView, 'select' ); - return linkFeature._showPanel( true ) - .then( () => { - sinon.assert.calledOnce( spy ); - } ); + linkFeature._showPanel( true ); + sinon.assert.calledOnce( spy ); } ); it( 'should focus the #formView when called with a `true` parameter while the balloon is open and the #formView is visible', () => { const spy = testUtils.sinon.spy( formView.urlInputView, 'select' ); - return linkFeature._showPanel( false ) - .then( () => linkFeature._showPanel( true ) ) - .then( () => { - sinon.assert.calledOnce( spy ); - } ); + linkFeature._showPanel( false ); + linkFeature._showPanel( true ); + sinon.assert.calledOnce( spy ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/53 it( 'should set formView.unlinkButtonView#isVisible depending on the selection in a link or not', () => { setModelData( editor.document, 'f[]oo' ); - return linkFeature._showPanel() - .then( () => { - expect( formView.unlinkButtonView.isVisible ).to.be.false; + linkFeature._showPanel(); + expect( formView.unlinkButtonView.isVisible ).to.be.false; - setModelData( editor.document, '<$text linkHref="url">f[]oo' ); + setModelData( editor.document, '<$text linkHref="url">f[]oo' ); - return linkFeature._showPanel() - .then( () => { - expect( formView.unlinkButtonView.isVisible ).to.be.true; - } ); - } ); + linkFeature._showPanel(); + expect( formView.unlinkButtonView.isVisible ).to.be.true; } ); // https://github.com/ckeditor/ckeditor5-link/issues/78 @@ -222,20 +195,16 @@ describe( 'Link', () => { // Mock some leftover value **in DOM**, e.g. after previous editing. formView.urlInputView.inputView.element.value = 'leftover'; - return linkFeature._showPanel() - .then( () => { - expect( formView.urlInputView.inputView.element.value ).to.equal( 'url' ); - } ); + linkFeature._showPanel(); + expect( formView.urlInputView.inputView.element.value ).to.equal( 'url' ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/123 it( 'should make sure the URL input in the #formView always stays in sync with the value of the command (no link selected)', () => { setModelData( editor.document, 'f[]oo' ); - return linkFeature._showPanel() - .then( () => { - expect( formView.urlInputView.inputView.element.value ).to.equal( '' ); - } ); + linkFeature._showPanel(); + expect( formView.urlInputView.inputView.element.value ).to.equal( '' ); } ); describe( 'when the document is rendering', () => { @@ -246,17 +215,13 @@ describe( 'Link', () => { const spy = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - return linkFeature._showPanel() - .then( () => { - viewDocument.render(); - linkFeature._hidePanel(); - - return linkFeature._showPanel() - .then( () => { - viewDocument.render(); - sinon.assert.calledTwice( spy ); - } ); - } ); + linkFeature._showPanel(); + viewDocument.render(); + linkFeature._hidePanel(); + + linkFeature._showPanel(); + viewDocument.render(); + sinon.assert.calledTwice( spy ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/113 @@ -265,20 +230,18 @@ describe( 'Link', () => { setModelData( editor.document, '<$text linkHref="url">f[]oo' ); - return linkFeature._showPanel() - .then( () => { - const spy = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); + linkFeature._showPanel(); + const spy = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - const root = viewDocument.getRoot(); - const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 ); + const root = viewDocument.getRoot(); + const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 ); - // Move selection to foo[]. - viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true ); - viewDocument.render(); + // Move selection to foo[]. + viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true ); + viewDocument.render(); - sinon.assert.calledOnce( spy ); - sinon.assert.calledWithExactly( spy ); - } ); + sinon.assert.calledOnce( spy ); + sinon.assert.calledWithExactly( spy ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/113 @@ -287,23 +250,21 @@ describe( 'Link', () => { setModelData( editor.document, 'f[]oo' ); - return linkFeature._showPanel() - .then( () => { - const spy = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); + linkFeature._showPanel(); + const spy = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - // Fires #render. - const root = viewDocument.getRoot(); - const text = root.getChild( 0 ).getChild( 0 ); + // Fires #render. + const root = viewDocument.getRoot(); + const text = root.getChild( 0 ).getChild( 0 ); - viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true ); - viewDocument.render(); + viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true ); + viewDocument.render(); - sinon.assert.calledOnce( spy ); - sinon.assert.calledWithExactly( spy, { - target: editorElement.ownerDocument.getSelection().getRangeAt( 0 ), - limiter: editorElement - } ); - } ); + sinon.assert.calledOnce( spy ); + sinon.assert.calledWithExactly( spy, { + target: editorElement.ownerDocument.getSelection().getRangeAt( 0 ), + limiter: editorElement + } ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/113 @@ -312,21 +273,20 @@ describe( 'Link', () => { setModelData( editor.document, '<$text linkHref="url">f[]oobar' ); - return linkFeature._showPanel() - .then( () => { - const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); + linkFeature._showPanel(); - const root = viewDocument.getRoot(); - const text = root.getChild( 0 ).getChild( 1 ); + const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); + const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); - // Move selection to b[]ar. - viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true ); - viewDocument.render(); + const root = viewDocument.getRoot(); + const text = root.getChild( 0 ).getChild( 1 ); - sinon.assert.calledOnce( spyHide ); - sinon.assert.notCalled( spyUpdate ); - } ); + // Move selection to b[]ar. + viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true ); + viewDocument.render(); + + sinon.assert.calledOnce( spyHide ); + sinon.assert.notCalled( spyUpdate ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/113 @@ -338,21 +298,20 @@ describe( 'Link', () => { '<$text linkHref="url">f[]oobar<$text linkHref="url">b[]az' ); - return linkFeature._showPanel() - .then( () => { - const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); + linkFeature._showPanel(); + + const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); + const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); - const root = viewDocument.getRoot(); - const text = root.getChild( 0 ).getChild( 2 ).getChild( 0 ); + const root = viewDocument.getRoot(); + const text = root.getChild( 0 ).getChild( 2 ).getChild( 0 ); - // Move selection to b[]az. - viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true ); - viewDocument.render(); + // Move selection to b[]az. + viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true ); + viewDocument.render(); - sinon.assert.calledOnce( spyHide ); - sinon.assert.notCalled( spyUpdate ); - } ); + sinon.assert.calledOnce( spyHide ); + sinon.assert.notCalled( spyUpdate ); } ); // https://github.com/ckeditor/ckeditor5-link/issues/113 @@ -361,21 +320,20 @@ describe( 'Link', () => { setModelData( editor.document, '<$text linkHref="url">f[]oo' ); - return linkFeature._showPanel() - .then( () => { - const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); - const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); + linkFeature._showPanel(); + + const spyUpdate = testUtils.sinon.stub( balloon, 'updatePosition', () => {} ); + const spyHide = testUtils.sinon.spy( linkFeature, '_hidePanel' ); - const root = viewDocument.getRoot(); - const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 ); + const root = viewDocument.getRoot(); + const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 ); - // Move selection to f[o]o. - viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 2 ) ], true ); - viewDocument.render(); + // Move selection to f[o]o. + viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 2 ) ], true ); + viewDocument.render(); - sinon.assert.calledOnce( spyHide ); - sinon.assert.notCalled( spyUpdate ); - } ); + sinon.assert.calledOnce( spyHide ); + sinon.assert.notCalled( spyUpdate ); } ); } ); } ); @@ -423,9 +381,7 @@ describe( 'Link', () => { const spy = sinon.spy(); linkFeature.listenTo( editor.editing.view, 'render', spy ); - linkFeature._hidePanel(); - editor.editing.view.render(); sinon.assert.notCalled( spy ); @@ -448,11 +404,9 @@ describe( 'Link', () => { } ); it( 'should show the #_balloon on execute event with the selected #formView', () => { - // Method is stubbed because it returns internal promise which can't be returned in test. const spy = testUtils.sinon.stub( linkFeature, '_showPanel', () => {} ); linkButton.fire( 'execute' ); - sinon.assert.calledWithExactly( spy, true ); } ); } ); @@ -484,11 +438,9 @@ describe( 'Link', () => { describe( 'keyboard support', () => { it( 'should show the #_balloon with selected #formView on `CTRL+K` keystroke', () => { - // Method is stubbed because it returns internal promise which can't be returned in test. const spy = testUtils.sinon.stub( linkFeature, '_showPanel', () => {} ); editor.keystrokes.press( { keyCode: keyCodes.k, ctrlKey: true } ); - sinon.assert.calledWithExactly( spy, true ); } ); @@ -510,23 +462,21 @@ describe( 'Link', () => { sinon.assert.notCalled( spy ); // Balloon is visible, form focused. - return linkFeature._showPanel( true ) - .then( () => { - formView.focusTracker.isFocused = true; - - editor.keystrokes.press( keyEvtData ); - sinon.assert.notCalled( keyEvtData.preventDefault ); - sinon.assert.notCalled( keyEvtData.stopPropagation ); - sinon.assert.notCalled( spy ); - - // Balloon is still visible, form not focused. - formView.focusTracker.isFocused = false; - - editor.keystrokes.press( keyEvtData ); - sinon.assert.calledOnce( keyEvtData.preventDefault ); - sinon.assert.calledOnce( keyEvtData.stopPropagation ); - sinon.assert.calledOnce( spy ); - } ); + linkFeature._showPanel( true ); + formView.focusTracker.isFocused = true; + + editor.keystrokes.press( keyEvtData ); + sinon.assert.notCalled( keyEvtData.preventDefault ); + sinon.assert.notCalled( keyEvtData.stopPropagation ); + sinon.assert.notCalled( spy ); + + // Balloon is still visible, form not focused. + formView.focusTracker.isFocused = false; + + editor.keystrokes.press( keyEvtData ); + sinon.assert.calledOnce( keyEvtData.preventDefault ); + sinon.assert.calledOnce( keyEvtData.stopPropagation ); + sinon.assert.calledOnce( spy ); } ); it( 'should hide the #_balloon after Esc key press (from editor) and not focus the editable', () => { @@ -538,11 +488,10 @@ describe( 'Link', () => { }; // Balloon is visible. - return linkFeature._showPanel( false ).then( () => { - editor.keystrokes.press( keyEvtData ); + linkFeature._showPanel( false ); + editor.keystrokes.press( keyEvtData ); - sinon.assert.calledWithExactly( spy ); - } ); + sinon.assert.calledWithExactly( spy ); } ); it( 'should not hide #_balloon after Esc key press (from editor) when #_balloon is open but is not visible', () => { @@ -559,13 +508,11 @@ describe( 'Link', () => { destroy: () => {} }; - return linkFeature._showPanel( false ) - .then( () => balloon.add( { view: viewMock } ) ) - .then( () => { - editor.keystrokes.press( keyEvtData ); + linkFeature._showPanel( false ); + balloon.add( { view: viewMock } ); + editor.keystrokes.press( keyEvtData ); - sinon.assert.notCalled( spy ); - } ); + sinon.assert.notCalled( spy ); } ); it( 'should hide the #_balloon after Esc key press (from the form) and focus the editable', () => { @@ -576,12 +523,10 @@ describe( 'Link', () => { stopPropagation: sinon.spy() }; - return linkFeature._showPanel( true ) - .then( () => { - formView.keystrokes.press( keyEvtData ); + linkFeature._showPanel( true ); - sinon.assert.calledWithExactly( spy, true ); - } ); + formView.keystrokes.press( keyEvtData ); + sinon.assert.calledWithExactly( spy, true ); } ); } ); @@ -589,23 +534,19 @@ describe( 'Link', () => { it( 'should hide #_balloon and not focus editable on click outside the #_balloon', () => { const spy = testUtils.sinon.spy( linkFeature, '_hidePanel' ); - return linkFeature._showPanel( true ) - .then( () => { - document.body.dispatchEvent( new Event( 'mouseup', { bubbles: true } ) ); + linkFeature._showPanel( true ); + document.body.dispatchEvent( new Event( 'mouseup', { bubbles: true } ) ); - sinon.assert.calledWithExactly( spy ); - } ); + sinon.assert.calledWithExactly( spy ); } ); it( 'should not hide #_balloon on click inside the #_balloon', () => { const spy = testUtils.sinon.spy( linkFeature, '_hidePanel' ); - return linkFeature._showPanel( true ) - .then( () => { - balloon.view.element.dispatchEvent( new Event( 'mouseup', { bubbles: true } ) ); + linkFeature._showPanel( true ); + balloon.view.element.dispatchEvent( new Event( 'mouseup', { bubbles: true } ) ); - sinon.assert.notCalled( spy ); - } ); + sinon.assert.notCalled( spy ); } ); describe( 'clicking on editable', () => { @@ -615,7 +556,6 @@ describe( 'Link', () => { observer = editor.editing.view.getObserver( ClickObserver ); editor.document.schema.allow( { name: '$text', inside: '$root' } ); - // Method is stubbed because it returns internal promise which can't be returned in test. spy = testUtils.sinon.stub( linkFeature, '_showPanel', () => {} ); } ); @@ -692,14 +632,11 @@ describe( 'Link', () => { } ); it( 'should mark the editor ui as focused when the #formView is focused', () => { - return linkFeature._showPanel() - .then( () => { - editor.ui.focusTracker.isFocused = false; + linkFeature._showPanel(); + editor.ui.focusTracker.isFocused = false; + formView.element.dispatchEvent( new Event( 'focus' ) ); - formView.element.dispatchEvent( new Event( 'focus' ) ); - - expect( editor.ui.focusTracker.isFocused ).to.true; - } ); + expect( editor.ui.focusTracker.isFocused ).to.true; } ); describe( 'binding', () => { @@ -726,13 +663,11 @@ describe( 'Link', () => { } ); it( 'should hide and focus editable on formView#submit event', () => { - return linkFeature._showPanel() - .then( () => { - formView.fire( 'submit' ); + linkFeature._showPanel(); + formView.fire( 'submit' ); - expect( balloon.visibleView ).to.null; - expect( focusEditableSpy.calledOnce ).to.true; - } ); + expect( balloon.visibleView ).to.null; + expect( focusEditableSpy.calledOnce ).to.true; } ); it( 'should execute unlink command on formView#unlink event', () => { @@ -745,23 +680,19 @@ describe( 'Link', () => { } ); it( 'should hide and focus editable on formView#unlink event', () => { - return linkFeature._showPanel() - .then( () => { - formView.fire( 'unlink' ); + linkFeature._showPanel(); + formView.fire( 'unlink' ); - expect( balloon.visibleView ).to.null; - expect( focusEditableSpy.calledOnce ).to.true; - } ); + expect( balloon.visibleView ).to.null; + expect( focusEditableSpy.calledOnce ).to.true; } ); it( 'should hide and focus editable on formView#cancel event', () => { - return linkFeature._showPanel() - .then( () => { - formView.fire( 'cancel' ); + linkFeature._showPanel(); + formView.fire( 'cancel' ); - expect( balloon.visibleView ).to.null; - expect( focusEditableSpy.calledOnce ).to.true; - } ); + expect( balloon.visibleView ).to.null; + expect( focusEditableSpy.calledOnce ).to.true; } ); } ); } ); diff --git a/tests/ui/linkformview.js b/tests/ui/linkformview.js index 87ca294..e983cf0 100644 --- a/tests/ui/linkformview.js +++ b/tests/ui/linkformview.js @@ -130,10 +130,9 @@ describe( 'LinkFormView', () => { const spy = sinon.spy( view.keystrokes, 'listenTo' ); - return view.init().then( () => { - sinon.assert.calledOnce( spy ); - sinon.assert.calledWithExactly( spy, view.element ); - } ); + view.init(); + sinon.assert.calledOnce( spy ); + sinon.assert.calledWithExactly( spy, view.element ); } ); describe( 'activates keyboard navigation for the toolbar', () => {