|
|
@@ -1,25 +1,29 @@
|
|
|
/* globals document */
|
|
|
|
|
|
-import View from '../../src/view/view';
|
|
|
-import MutationObserver from '../../src/view/observer/mutationobserver';
|
|
|
+import View from '../../../src/view/view';
|
|
|
+import MutationObserver from '../../../src/view/observer/mutationobserver';
|
|
|
import count from '@ckeditor/ckeditor5-utils/src/count';
|
|
|
-import KeyObserver from '../../src/view/observer/keyobserver';
|
|
|
-import FakeSelectionObserver from '../../src/view/observer/fakeselectionobserver';
|
|
|
-import SelectionObserver from '../../src/view/observer/selectionobserver';
|
|
|
-import FocusObserver from '../../src/view/observer/focusobserver';
|
|
|
-import createViewRoot from './_utils/createroot';
|
|
|
-import Document from '../../src/view/document';
|
|
|
-import Observer from '../../src/view/observer/observer';
|
|
|
+import KeyObserver from '../../../src/view/observer/keyobserver';
|
|
|
+import FakeSelectionObserver from '../../../src/view/observer/fakeselectionobserver';
|
|
|
+import SelectionObserver from '../../../src/view/observer/selectionobserver';
|
|
|
+import FocusObserver from '../../../src/view/observer/focusobserver';
|
|
|
+import createViewRoot from '../_utils/createroot';
|
|
|
+import Observer from '../../../src/view/observer/observer';
|
|
|
import log from '@ckeditor/ckeditor5-utils/src/log';
|
|
|
import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
|
|
|
import global from '@ckeditor/ckeditor5-utils/src/dom/global';
|
|
|
-import ViewRange from '../../src/view/range';
|
|
|
+import ViewRange from '../../../src/view/range';
|
|
|
+import RootEditableElement from '../../../src/view/rooteditableelement';
|
|
|
+import ViewElement from '../../../src/view/element';
|
|
|
+import { isBlockFiller, BR_FILLER } from '../../../src/view/filler';
|
|
|
import createElement from '@ckeditor/ckeditor5-utils/src/dom/createelement';
|
|
|
|
|
|
describe( 'view', () => {
|
|
|
const DEFAULT_OBSERVERS_COUNT = 5;
|
|
|
let domRoot, view, viewDocument, ObserverMock, instantiated, enabled, ObserverMockGlobalCount;
|
|
|
|
|
|
+ testUtils.createSinonSandbox();
|
|
|
+
|
|
|
beforeEach( () => {
|
|
|
domRoot = createElement( document, 'div', {
|
|
|
id: 'editor',
|
|
|
@@ -30,8 +34,8 @@ describe( 'view', () => {
|
|
|
viewDocument = view.document;
|
|
|
|
|
|
ObserverMock = class extends Observer {
|
|
|
- constructor( viewDocument ) {
|
|
|
- super( viewDocument );
|
|
|
+ constructor( view ) {
|
|
|
+ super( view );
|
|
|
|
|
|
this.enable = sinon.spy();
|
|
|
this.disable = sinon.spy();
|
|
|
@@ -43,8 +47,8 @@ describe( 'view', () => {
|
|
|
enabled = 0;
|
|
|
|
|
|
ObserverMockGlobalCount = class extends Observer {
|
|
|
- constructor( viewDocument ) {
|
|
|
- super( viewDocument );
|
|
|
+ constructor( view ) {
|
|
|
+ super( view );
|
|
|
instantiated++;
|
|
|
|
|
|
this.observe = sinon.spy();
|
|
|
@@ -74,38 +78,39 @@ describe( 'view', () => {
|
|
|
const domDiv = document.createElement( 'div' );
|
|
|
const viewRoot = createViewRoot( viewDocument, 'div', 'main' );
|
|
|
|
|
|
- expect( count( viewDocument.domRoots ) ).to.equal( 0 );
|
|
|
+ expect( count( view.domRoots ) ).to.equal( 0 );
|
|
|
|
|
|
- viewDocument.attachDomRoot( domDiv );
|
|
|
+ view.attachDomRoot( domDiv );
|
|
|
|
|
|
- expect( count( viewDocument.domRoots ) ).to.equal( 1 );
|
|
|
+ expect( count( view.domRoots ) ).to.equal( 1 );
|
|
|
|
|
|
- expect( viewDocument.getDomRoot() ).to.equal( domDiv );
|
|
|
- expect( viewDocument.domConverter.mapViewToDom( viewRoot ) ).to.equal( domDiv );
|
|
|
+ expect( view.getDomRoot() ).to.equal( domDiv );
|
|
|
+ expect( view.domConverter.mapViewToDom( viewRoot ) ).to.equal( domDiv );
|
|
|
|
|
|
- expect( viewDocument.renderer.markedChildren.has( viewRoot ) ).to.be.true;
|
|
|
+ expect( view.renderer.markedChildren.has( viewRoot ) ).to.be.true;
|
|
|
} );
|
|
|
|
|
|
it( 'should attach DOM element to custom view element', () => {
|
|
|
const domH1 = document.createElement( 'h1' );
|
|
|
const viewH1 = createViewRoot( viewDocument, 'h1', 'header' );
|
|
|
|
|
|
- expect( count( viewDocument.domRoots ) ).to.equal( 0 );
|
|
|
+ expect( count( view.domRoots ) ).to.equal( 0 );
|
|
|
|
|
|
- viewDocument.attachDomRoot( domH1, 'header' );
|
|
|
+ view.attachDomRoot( domH1, 'header' );
|
|
|
|
|
|
- expect( count( viewDocument.domRoots ) ).to.equal( 1 );
|
|
|
- expect( viewDocument.getDomRoot( 'header' ) ).to.equal( domH1 );
|
|
|
- expect( viewDocument.domConverter.mapViewToDom( viewH1 ) ).to.equal( domH1 );
|
|
|
- expect( viewDocument.renderer.markedChildren.has( viewH1 ) ).to.be.true;
|
|
|
+ expect( count( view.domRoots ) ).to.equal( 1 );
|
|
|
+ expect( view.getDomRoot( 'header' ) ).to.equal( domH1 );
|
|
|
+ expect( view.domConverter.mapViewToDom( viewH1 ) ).to.equal( domH1 );
|
|
|
+ expect( view.renderer.markedChildren.has( viewH1 ) ).to.be.true;
|
|
|
} );
|
|
|
|
|
|
it( 'should call observe on each observer', () => {
|
|
|
// The variable will be overwritten.
|
|
|
- viewDocument.destroy();
|
|
|
+ view.destroy();
|
|
|
|
|
|
- viewDocument = new Document( document.createElement( 'div' ) );
|
|
|
- viewDocument.renderer.render = sinon.spy();
|
|
|
+ view = new View();
|
|
|
+ viewDocument = view.document;
|
|
|
+ view.renderer.render = sinon.spy();
|
|
|
|
|
|
const domDiv1 = document.createElement( 'div' );
|
|
|
domDiv1.setAttribute( 'id', 'editor' );
|
|
|
@@ -113,11 +118,11 @@ describe( 'view', () => {
|
|
|
const domDiv2 = document.createElement( 'div' );
|
|
|
domDiv2.setAttribute( 'id', 'editor' );
|
|
|
|
|
|
- const observerMock = viewDocument.addObserver( ObserverMock );
|
|
|
- const observerMockGlobalCount = viewDocument.addObserver( ObserverMockGlobalCount );
|
|
|
+ const observerMock = view.addObserver( ObserverMock );
|
|
|
+ const observerMockGlobalCount = view.addObserver( ObserverMockGlobalCount );
|
|
|
|
|
|
createViewRoot( viewDocument, 'div', 'root1' );
|
|
|
- viewDocument.attachDomRoot( document.createElement( 'div' ), 'root1' );
|
|
|
+ view.attachDomRoot( document.createElement( 'div' ), 'root1' );
|
|
|
|
|
|
sinon.assert.calledOnce( observerMock.observe );
|
|
|
sinon.assert.calledOnce( observerMockGlobalCount.observe );
|
|
|
@@ -127,28 +132,29 @@ describe( 'view', () => {
|
|
|
describe( 'addObserver()', () => {
|
|
|
beforeEach( () => {
|
|
|
// The variable will be overwritten.
|
|
|
- viewDocument.destroy();
|
|
|
+ view.destroy();
|
|
|
|
|
|
- viewDocument = new Document( document.createElement( 'div' ) );
|
|
|
- viewDocument.renderer.render = sinon.spy();
|
|
|
+ view = new View();
|
|
|
+ viewDocument = view.document;
|
|
|
+ view.renderer.render = sinon.spy();
|
|
|
} );
|
|
|
|
|
|
afterEach( () => {
|
|
|
- viewDocument.destroy();
|
|
|
+ view.destroy();
|
|
|
} );
|
|
|
|
|
|
it( 'should be instantiated and enabled on adding', () => {
|
|
|
- const observerMock = viewDocument.addObserver( ObserverMock );
|
|
|
+ const observerMock = view.addObserver( ObserverMock );
|
|
|
|
|
|
- expect( viewDocument._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 1 );
|
|
|
+ expect( view._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 1 );
|
|
|
|
|
|
expect( observerMock ).to.have.property( 'document', viewDocument );
|
|
|
sinon.assert.calledOnce( observerMock.enable );
|
|
|
} );
|
|
|
|
|
|
it( 'should return observer instance each time addObserver is called', () => {
|
|
|
- const observerMock1 = viewDocument.addObserver( ObserverMock );
|
|
|
- const observerMock2 = viewDocument.addObserver( ObserverMock );
|
|
|
+ const observerMock1 = view.addObserver( ObserverMock );
|
|
|
+ const observerMock2 = view.addObserver( ObserverMock );
|
|
|
|
|
|
expect( observerMock1 ).to.be.instanceof( ObserverMock );
|
|
|
expect( observerMock2 ).to.be.instanceof( ObserverMock );
|
|
|
@@ -156,15 +162,15 @@ describe( 'view', () => {
|
|
|
} );
|
|
|
|
|
|
it( 'should instantiate one observer only once', () => {
|
|
|
- viewDocument.addObserver( ObserverMockGlobalCount );
|
|
|
- viewDocument.addObserver( ObserverMockGlobalCount );
|
|
|
+ view.addObserver( ObserverMockGlobalCount );
|
|
|
+ view.addObserver( ObserverMockGlobalCount );
|
|
|
|
|
|
- expect( viewDocument._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 1 );
|
|
|
+ expect( view._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 1 );
|
|
|
expect( instantiated ).to.equal( 1 );
|
|
|
expect( enabled ).to.equal( 1 );
|
|
|
|
|
|
- viewDocument.addObserver( ObserverMock );
|
|
|
- expect( viewDocument._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 2 );
|
|
|
+ view.addObserver( ObserverMock );
|
|
|
+ expect( view._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 2 );
|
|
|
} );
|
|
|
|
|
|
it( 'should instantiate child class of already registered observer', () => {
|
|
|
@@ -175,18 +181,18 @@ describe( 'view', () => {
|
|
|
enable() {}
|
|
|
}
|
|
|
|
|
|
- viewDocument.addObserver( ObserverMock );
|
|
|
- viewDocument.addObserver( ChildObserverMock );
|
|
|
+ view.addObserver( ObserverMock );
|
|
|
+ view.addObserver( ChildObserverMock );
|
|
|
|
|
|
- expect( viewDocument._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 2 );
|
|
|
+ expect( view._observers.size ).to.equal( DEFAULT_OBSERVERS_COUNT + 2 );
|
|
|
} );
|
|
|
|
|
|
it( 'should be disabled and re-enabled on render', () => {
|
|
|
- const observerMock = viewDocument.addObserver( ObserverMock );
|
|
|
- viewDocument.render();
|
|
|
+ const observerMock = view.addObserver( ObserverMock );
|
|
|
+ view.render();
|
|
|
|
|
|
sinon.assert.calledOnce( observerMock.disable );
|
|
|
- sinon.assert.calledOnce( viewDocument.renderer.render );
|
|
|
+ sinon.assert.calledOnce( view.renderer.render );
|
|
|
sinon.assert.calledTwice( observerMock.enable );
|
|
|
} );
|
|
|
|
|
|
@@ -194,10 +200,10 @@ describe( 'view', () => {
|
|
|
createViewRoot( viewDocument, 'div', 'roo1' );
|
|
|
createViewRoot( viewDocument, 'div', 'roo2' );
|
|
|
|
|
|
- viewDocument.attachDomRoot( document.createElement( 'div' ), 'roo1' );
|
|
|
- viewDocument.attachDomRoot( document.createElement( 'div' ), 'roo2' );
|
|
|
+ view.attachDomRoot( document.createElement( 'div' ), 'roo1' );
|
|
|
+ view.attachDomRoot( document.createElement( 'div' ), 'roo2' );
|
|
|
|
|
|
- const observerMock = viewDocument.addObserver( ObserverMock );
|
|
|
+ const observerMock = view.addObserver( ObserverMock );
|
|
|
|
|
|
sinon.assert.calledTwice( observerMock.observe );
|
|
|
} );
|
|
|
@@ -205,15 +211,15 @@ describe( 'view', () => {
|
|
|
|
|
|
describe( 'getObserver()', () => {
|
|
|
it( 'should return observer it it is added', () => {
|
|
|
- const addedObserverMock = viewDocument.addObserver( ObserverMock );
|
|
|
- const getObserverMock = viewDocument.getObserver( ObserverMock );
|
|
|
+ const addedObserverMock = view.addObserver( ObserverMock );
|
|
|
+ const getObserverMock = view.getObserver( ObserverMock );
|
|
|
|
|
|
expect( getObserverMock ).to.be.instanceof( ObserverMock );
|
|
|
expect( getObserverMock ).to.equal( addedObserverMock );
|
|
|
} );
|
|
|
|
|
|
it( 'should return undefined if observer is not added', () => {
|
|
|
- const getObserverMock = viewDocument.getObserver( ObserverMock );
|
|
|
+ const getObserverMock = view.getObserver( ObserverMock );
|
|
|
|
|
|
expect( getObserverMock ).to.be.undefined;
|
|
|
} );
|
|
|
@@ -228,16 +234,16 @@ describe( 'view', () => {
|
|
|
it( 'does nothing when there are no ranges in the selection', () => {
|
|
|
const stub = testUtils.sinon.stub( global.window, 'scrollTo' );
|
|
|
|
|
|
- viewDocument.scrollToTheSelection();
|
|
|
+ view.scrollToTheSelection();
|
|
|
sinon.assert.notCalled( stub );
|
|
|
} );
|
|
|
|
|
|
- it( 'scrolls to the first range in selection with an offset', () => {
|
|
|
+ it.only( 'scrolls to the first range in selection with an offset', () => {
|
|
|
const root = createViewRoot( viewDocument, 'div', 'main' );
|
|
|
const stub = testUtils.sinon.stub( global.window, 'scrollTo' );
|
|
|
const range = ViewRange.createIn( root );
|
|
|
|
|
|
- viewDocument.attachDomRoot( domRoot );
|
|
|
+ view.attachDomRoot( domRoot );
|
|
|
|
|
|
// Make sure the window will have to scroll to the domRoot.
|
|
|
Object.assign( domRoot.style, {
|
|
|
@@ -248,19 +254,19 @@ describe( 'view', () => {
|
|
|
|
|
|
viewDocument.selection.addRange( range );
|
|
|
|
|
|
- viewDocument.scrollToTheSelection();
|
|
|
+ view.scrollToTheSelection();
|
|
|
sinon.assert.calledWithMatch( stub, sinon.match.number, sinon.match.number );
|
|
|
} );
|
|
|
} );
|
|
|
|
|
|
describe( 'disableObservers()', () => {
|
|
|
it( 'should disable observers', () => {
|
|
|
- const addedObserverMock = viewDocument.addObserver( ObserverMock );
|
|
|
+ const addedObserverMock = view.addObserver( ObserverMock );
|
|
|
|
|
|
expect( addedObserverMock.enable.calledOnce ).to.be.true;
|
|
|
expect( addedObserverMock.disable.called ).to.be.false;
|
|
|
|
|
|
- viewDocument.disableObservers();
|
|
|
+ view.disableObservers();
|
|
|
|
|
|
expect( addedObserverMock.enable.calledOnce ).to.be.true;
|
|
|
expect( addedObserverMock.disable.calledOnce ).to.be.true;
|
|
|
@@ -269,14 +275,14 @@ describe( 'view', () => {
|
|
|
|
|
|
describe( 'enableObservers()', () => {
|
|
|
it( 'should enable observers', () => {
|
|
|
- const addedObserverMock = viewDocument.addObserver( ObserverMock );
|
|
|
+ const addedObserverMock = view.addObserver( ObserverMock );
|
|
|
|
|
|
- viewDocument.disableObservers();
|
|
|
+ view.disableObservers();
|
|
|
|
|
|
expect( addedObserverMock.enable.calledOnce ).to.be.true;
|
|
|
expect( addedObserverMock.disable.calledOnce ).to.be.true;
|
|
|
|
|
|
- viewDocument.enableObservers();
|
|
|
+ view.enableObservers();
|
|
|
|
|
|
expect( addedObserverMock.enable.calledTwice ).to.be.true;
|
|
|
expect( addedObserverMock.disable.calledOnce ).to.be.true;
|
|
|
@@ -291,7 +297,7 @@ describe( 'view', () => {
|
|
|
domEditable.setAttribute( 'contenteditable', 'true' );
|
|
|
document.body.appendChild( domEditable );
|
|
|
viewEditable = createViewRoot( viewDocument, 'div', 'main' );
|
|
|
- viewDocument.attachDomRoot( domEditable );
|
|
|
+ view.attachDomRoot( domEditable );
|
|
|
viewDocument.selection.addRange( ViewRange.createFromParentsAndOffsets( viewEditable, 0, viewEditable, 0 ) );
|
|
|
} );
|
|
|
|
|
|
@@ -300,10 +306,10 @@ describe( 'view', () => {
|
|
|
} );
|
|
|
|
|
|
it( 'should focus editable with selection', () => {
|
|
|
- const converterFocusSpy = testUtils.sinon.spy( viewDocument.domConverter, 'focus' );
|
|
|
- const renderSpy = testUtils.sinon.spy( viewDocument, 'render' );
|
|
|
+ const converterFocusSpy = testUtils.sinon.spy( view.domConverter, 'focus' );
|
|
|
+ const renderSpy = testUtils.sinon.spy( view, 'render' );
|
|
|
|
|
|
- viewDocument.focus();
|
|
|
+ view.focus();
|
|
|
|
|
|
expect( converterFocusSpy.called ).to.be.true;
|
|
|
expect( renderSpy.calledOnce ).to.be.true;
|
|
|
@@ -317,11 +323,11 @@ describe( 'view', () => {
|
|
|
} );
|
|
|
|
|
|
it( 'should not focus if document is already focused', () => {
|
|
|
- const converterFocusSpy = testUtils.sinon.spy( viewDocument.domConverter, 'focus' );
|
|
|
- const renderSpy = testUtils.sinon.spy( viewDocument, 'render' );
|
|
|
+ const converterFocusSpy = testUtils.sinon.spy( view.domConverter, 'focus' );
|
|
|
+ const renderSpy = testUtils.sinon.spy( view, 'render' );
|
|
|
viewDocument.isFocused = true;
|
|
|
|
|
|
- viewDocument.focus();
|
|
|
+ view.focus();
|
|
|
|
|
|
expect( converterFocusSpy.called ).to.be.false;
|
|
|
expect( renderSpy.called ).to.be.false;
|
|
|
@@ -331,7 +337,7 @@ describe( 'view', () => {
|
|
|
const logSpy = testUtils.sinon.stub( log, 'warn' );
|
|
|
viewDocument.selection.removeAllRanges();
|
|
|
|
|
|
- viewDocument.focus();
|
|
|
+ view.focus();
|
|
|
expect( logSpy.calledOnce ).to.be.true;
|
|
|
expect( logSpy.args[ 0 ][ 0 ] ).to.match( /^view-focus-no-selection/ );
|
|
|
} );
|
|
|
@@ -340,33 +346,96 @@ describe( 'view', () => {
|
|
|
describe( 'isFocused', () => {
|
|
|
it( 'should change renderer.isFocused too', () => {
|
|
|
expect( viewDocument.isFocused ).to.equal( false );
|
|
|
- expect( viewDocument.renderer.isFocused ).to.equal( false );
|
|
|
+ expect( view.renderer.isFocused ).to.equal( false );
|
|
|
|
|
|
viewDocument.isFocused = true;
|
|
|
|
|
|
expect( viewDocument.isFocused ).to.equal( true );
|
|
|
- expect( viewDocument.renderer.isFocused ).to.equal( true );
|
|
|
+ expect( view.renderer.isFocused ).to.equal( true );
|
|
|
} );
|
|
|
} );
|
|
|
|
|
|
describe( 'render()', () => {
|
|
|
- it( 'should fire an event', () => {
|
|
|
- const spy = sinon.spy();
|
|
|
+ it( 'disable observers, renders and enable observers', () => {
|
|
|
+ const observerMock = view.addObserver( ObserverMock );
|
|
|
+ const renderStub = sinon.stub( view.renderer, 'render' );
|
|
|
+
|
|
|
+ view.render();
|
|
|
+
|
|
|
+ sinon.assert.callOrder( observerMock.disable, renderStub, observerMock.enable );
|
|
|
+ } );
|
|
|
+ } );
|
|
|
|
|
|
- viewDocument.on( 'render', spy );
|
|
|
+ describe( 'view and DOM integration', () => {
|
|
|
+ it( 'should remove content of the DOM', () => {
|
|
|
+ const domDiv = createElement( document, 'div', { id: 'editor' }, [
|
|
|
+ createElement( document, 'p' ),
|
|
|
+ createElement( document, 'p' )
|
|
|
+ ] );
|
|
|
|
|
|
- viewDocument.render();
|
|
|
+ const view = new View();
|
|
|
+ const viewDocument = view.document;
|
|
|
|
|
|
- expect( spy.calledOnce ).to.be.true;
|
|
|
+ createRoot( 'div', 'main', viewDocument );
|
|
|
+ view.attachDomRoot( domDiv );
|
|
|
+ view.render();
|
|
|
+
|
|
|
+ expect( domDiv.childNodes.length ).to.equal( 1 );
|
|
|
+ expect( isBlockFiller( domDiv.childNodes[ 0 ], BR_FILLER ) ).to.be.true;
|
|
|
+
|
|
|
+ view.destroy();
|
|
|
} );
|
|
|
|
|
|
- it( 'disable observers, renders and enable observers', () => {
|
|
|
- const observerMock = viewDocument.addObserver( ObserverMock );
|
|
|
- const renderStub = sinon.stub( viewDocument.renderer, 'render' );
|
|
|
+ it( 'should render changes in the Document', () => {
|
|
|
+ const domDiv = document.createElement( 'div' );
|
|
|
|
|
|
- viewDocument.render();
|
|
|
+ const view = new View();
|
|
|
+ const viewDocument = view.document;
|
|
|
+ createRoot( 'div', 'main', viewDocument );
|
|
|
+ view.attachDomRoot( domDiv );
|
|
|
|
|
|
- sinon.assert.callOrder( observerMock.disable, renderStub, observerMock.enable );
|
|
|
+ viewDocument.getRoot().appendChildren( new ViewElement( 'p' ) );
|
|
|
+ view.render();
|
|
|
+
|
|
|
+ expect( domDiv.childNodes.length ).to.equal( 1 );
|
|
|
+ expect( domDiv.childNodes[ 0 ].tagName ).to.equal( 'P' );
|
|
|
+
|
|
|
+ view.destroy();
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'should render attribute changes', () => {
|
|
|
+ const domRoot = document.createElement( 'div' );
|
|
|
+
|
|
|
+ const view = new View();
|
|
|
+ const viewDocument = view.document;
|
|
|
+ const viewRoot = createRoot( 'div', 'main', viewDocument );
|
|
|
+
|
|
|
+ view.attachDomRoot( domRoot );
|
|
|
+
|
|
|
+ const viewP = new ViewElement( 'p', { class: 'foo' } );
|
|
|
+ viewRoot.appendChildren( viewP );
|
|
|
+ view.render();
|
|
|
+
|
|
|
+ expect( domRoot.childNodes.length ).to.equal( 1 );
|
|
|
+ expect( domRoot.childNodes[ 0 ].getAttribute( 'class' ) ).to.equal( 'foo' );
|
|
|
+
|
|
|
+ viewP.setAttribute( 'class', 'bar' );
|
|
|
+ view.render();
|
|
|
+
|
|
|
+ expect( domRoot.childNodes.length ).to.equal( 1 );
|
|
|
+ expect( domRoot.childNodes[ 0 ].getAttribute( 'class' ) ).to.equal( 'bar' );
|
|
|
+
|
|
|
+ view.destroy();
|
|
|
} );
|
|
|
} );
|
|
|
+
|
|
|
+ function createRoot( name, rootName, viewDoc ) {
|
|
|
+ const viewRoot = new RootEditableElement( name );
|
|
|
+
|
|
|
+ viewRoot.rootName = rootName;
|
|
|
+ viewRoot.document = viewDoc;
|
|
|
+ viewDoc.roots.add( viewRoot );
|
|
|
+
|
|
|
+ return viewRoot;
|
|
|
+ }
|
|
|
} );
|