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

Commit dab70e6

Browse files
author
Piotr Jasiun
authored
Merge pull request #1446 from ckeditor/t/1445
Feature: Introduced `ViewDocument#layoutChanged` event. Closes #1445.
2 parents dfa0b39 + e498977 commit dab70e6

File tree

3 files changed

+44
-18
lines changed

3 files changed

+44
-18
lines changed

src/view/document.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ export default class Document {
140140
}
141141
} while ( wasFixed );
142142
}
143+
144+
/**
145+
* Event fired whenever document content layout changes. It is fired whenever content is
146+
* {@link module:engine/view/view~View#event:render rendered}, but should be also fired by observers in case of
147+
* other actions which may change layout, for instance when image loads.
148+
*
149+
* @event module:engine/view/document~Document#event:layoutChanged
150+
*/
143151
}
144152

145153
mix( Document, ObservableMixin );

src/view/view.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ export default class View {
149149
// Use 'normal' priority so that rendering is performed as first when using that priority.
150150
this.on( 'render', () => {
151151
this._render();
152+
153+
// Informs that layout has changed after render.
154+
this.document.fire( 'layoutChanged' );
152155
} );
153156
}
154157

tests/view/view/view.js

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
/* globals document */
22

33
import View from '../../../src/view/view';
4+
import Observer from '../../../src/view/observer/observer';
45
import MutationObserver from '../../../src/view/observer/mutationobserver';
5-
import count from '@ckeditor/ckeditor5-utils/src/count';
66
import KeyObserver from '../../../src/view/observer/keyobserver';
77
import FakeSelectionObserver from '../../../src/view/observer/fakeselectionobserver';
88
import SelectionObserver from '../../../src/view/observer/selectionobserver';
99
import FocusObserver from '../../../src/view/observer/focusobserver';
1010
import CompositionObserver from '../../../src/view/observer/compositionobserver';
11-
import createViewRoot from '../_utils/createroot';
12-
import Observer from '../../../src/view/observer/observer';
13-
import log from '@ckeditor/ckeditor5-utils/src/log';
14-
import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
15-
import global from '@ckeditor/ckeditor5-utils/src/dom/global';
1611
import ViewRange from '../../../src/view/range';
17-
import RootEditableElement from '../../../src/view/rooteditableelement';
1812
import ViewElement from '../../../src/view/element';
1913
import ViewPosition from '../../../src/view/position';
2014
import { isBlockFiller, BR_FILLER } from '../../../src/view/filler';
21-
import createElement from '@ckeditor/ckeditor5-utils/src/dom/createelement';
2215
import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
16+
import log from '@ckeditor/ckeditor5-utils/src/log';
17+
18+
import count from '@ckeditor/ckeditor5-utils/src/count';
19+
import global from '@ckeditor/ckeditor5-utils/src/dom/global';
20+
import createViewRoot from '../_utils/createroot';
21+
import createElement from '@ckeditor/ckeditor5-utils/src/dom/createelement';
22+
import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
2323

2424
describe( 'view', () => {
2525
const DEFAULT_OBSERVERS_COUNT = 6;
@@ -45,6 +45,7 @@ describe( 'view', () => {
4545
this.enable = sinon.spy();
4646
this.disable = sinon.spy();
4747
this.observe = sinon.spy();
48+
this.destroy = sinon.spy();
4849
}
4950
};
5051

@@ -379,6 +380,20 @@ describe( 'view', () => {
379380

380381
sinon.assert.callOrder( observerMock.disable, renderStub, observerMock.enable );
381382
} );
383+
384+
it( 'should fire view.document.layoutChanged event on render', () => {
385+
const spy = sinon.spy();
386+
387+
view.document.on( 'layoutChanged', spy );
388+
389+
view.render();
390+
391+
sinon.assert.calledOnce( spy );
392+
393+
view.render();
394+
395+
sinon.assert.calledTwice( spy );
396+
} );
382397
} );
383398

384399
describe( 'view and DOM integration', () => {
@@ -391,7 +406,7 @@ describe( 'view', () => {
391406
const view = new View();
392407
const viewDocument = view.document;
393408

394-
createRoot( 'div', 'main', viewDocument );
409+
createViewRoot( viewDocument, 'div', 'main' );
395410
view.attachDomRoot( domDiv );
396411
view.render();
397412

@@ -407,7 +422,7 @@ describe( 'view', () => {
407422

408423
const view = new View();
409424
const viewDocument = view.document;
410-
createRoot( 'div', 'main', viewDocument );
425+
createViewRoot( viewDocument, 'div', 'main' );
411426
view.attachDomRoot( domDiv );
412427

413428
viewDocument.getRoot()._appendChild( new ViewElement( 'p' ) );
@@ -424,7 +439,7 @@ describe( 'view', () => {
424439

425440
const view = new View();
426441
const viewDocument = view.document;
427-
const viewRoot = createRoot( 'div', 'main', viewDocument );
442+
const viewRoot = createViewRoot( viewDocument, 'div', 'main' );
428443

429444
view.attachDomRoot( domRoot );
430445

@@ -588,13 +603,13 @@ describe( 'view', () => {
588603
} );
589604
} );
590605

591-
function createRoot( name, rootName, viewDoc ) {
592-
const viewRoot = new RootEditableElement( name );
606+
describe( 'destroy()', () => {
607+
it( 'should destroy all observers', () => {
608+
const observerMock = view.addObserver( ObserverMock );
593609

594-
viewRoot.rootName = rootName;
595-
viewRoot._document = viewDoc;
596-
viewDoc.roots.add( viewRoot );
610+
view.destroy();
597611

598-
return viewRoot;
599-
}
612+
sinon.assert.calledOnce( observerMock.destroy );
613+
} );
614+
} );
600615
} );

0 commit comments

Comments
 (0)