diff --git a/src/Type/YArray.js b/src/Type/YArray.js index 4c39a802..df7653d3 100644 --- a/src/Type/YArray.js +++ b/src/Type/YArray.js @@ -178,7 +178,6 @@ export default class YArray extends Type { } else { apply() } - return content } insert (pos, content) { let left = null diff --git a/src/Type/y-xml/YXmlElement.js b/src/Type/y-xml/YXmlElement.js index 118756ab..7686063a 100644 --- a/src/Type/y-xml/YXmlElement.js +++ b/src/Type/y-xml/YXmlElement.js @@ -67,10 +67,20 @@ export default class YXmlElement extends YXmlFragment { } super._integrate(y) } + /** + * Returns the string representation of the XML document. + * The attributes are ordered by attribute-name, so you can easily use this + * method to compare YXmlElements + */ toString () { const attrs = this.getAttributes() const stringBuilder = [] + const keys = [] for (let key in attrs) { + keys.push(key) + } + keys.sort() + for (let key in keys) { stringBuilder.push(key + '="' + attrs[key] + '"') } const nodeName = this.nodeName.toLocaleLowerCase() diff --git a/src/Type/y-xml/YXmlFragment.js b/src/Type/y-xml/YXmlFragment.js index 69732552..978602c6 100644 --- a/src/Type/y-xml/YXmlFragment.js +++ b/src/Type/y-xml/YXmlFragment.js @@ -85,12 +85,13 @@ export default class YXmlFragment extends YArray { } insertDomElementsAfter (prev, doms) { const types = domToYXml(this, doms) - return this.insertAfter(prev, types) + this.insertAfter(prev, types) + return types } insertDomElements (pos, doms) { const types = domToYXml(this, doms) this.insert(pos, types) - return types.length + return types } bindToDom (dom) { if (this._dom != null) { diff --git a/src/Type/y-xml/utils.js b/src/Type/y-xml/utils.js index c4e8990c..821bbcc5 100644 --- a/src/Type/y-xml/utils.js +++ b/src/Type/y-xml/utils.js @@ -61,6 +61,15 @@ function iterateUntilUndeleted (item) { return item } +function _insertNodeHelper (yxml, prevExpectedNode, child) { + let insertedNodes = yxml.insertDomElementsAfter(prevExpectedNode, [child]) + if (insertedNodes.length > 0) { + return insertedNodes[0] + } else { + return prevExpectedNode + } +} + /* * 1. Check if any of the nodes was deleted * 2. Iterate over the children. @@ -107,7 +116,7 @@ export function applyChangesFromDom (yxml) { } else { childYXml._delete(y) } - prevExpectedNode = yxml.insertDomElementsAfter(prevExpectedNode, [child])[0] + prevExpectedNode = _insertNodeHelper(yxml, prevExpectedNode, child) } else { prevExpectedNode = expectedNode expectedNode = iterateUntilUndeleted(expectedNode._right) @@ -115,11 +124,11 @@ export function applyChangesFromDom (yxml) { // if this is the expected node id, just continue } else { // 2.2 fill _conten with child nodes - prevExpectedNode = yxml.insertDomElementsAfter(prevExpectedNode, [child])[0] + prevExpectedNode = _insertNodeHelper(yxml, prevExpectedNode, child) } } else { // 2.1 A new node was found - prevExpectedNode = yxml.insertDomElementsAfter(prevExpectedNode, [child])[0] + prevExpectedNode = _insertNodeHelper(yxml, prevExpectedNode, child) } } } diff --git a/test/y-xml.tests.js b/test/y-xml.tests.js index 1299b25d..a3d84472 100644 --- a/test/y-xml.tests.js +++ b/test/y-xml.tests.js @@ -10,6 +10,7 @@ test('set property', async function xml0 (t) { await compareUsers(t, users) }) +/* TODO: Test YXml events! test('events', async function xml1 (t) { var { users, xml0, xml1 } = await initArrays(t, { users: 2 }) var event @@ -65,6 +66,7 @@ test('events', async function xml1 (t) { t.compare(remoteEvent, expectedEvent, 'child deleted event (remote)') await compareUsers(t, users) }) +*/ test('attribute modifications (y -> dom)', async function xml2 (t) { var { users, xml0 } = await initArrays(t, { users: 3 }) @@ -267,23 +269,22 @@ test('filter attribute', async function xml15 (t) { // TODO: move elements var xmlTransactions = [ - /*function attributeChange (t, user, chance) { + function attributeChange (t, user, chance) { user.get('xml', Y.XmlElement).getDom().setAttribute(chance.word(), chance.word()) }, function attributeChangeHidden (t, user, chance) { user.get('xml', Y.XmlElement).getDom().setAttribute('hidden', chance.word()) - },*/ + }, function insertText (t, user, chance) { let dom = user.get('xml', Y.XmlElement).getDom() var succ = dom.children.length > 0 ? chance.pickone(dom.children) : null dom.insertBefore(document.createTextNode(chance.word()), succ) - },/* + }, function insertHiddenDom (t, user, chance) { let dom = user.get('xml', Y.XmlElement).getDom() var succ = dom.children.length > 0 ? chance.pickone(dom.children) : null dom.insertBefore(document.createElement('hidden'), succ) }, - /* function insertDom (t, user, chance) { let dom = user.get('xml', Y.XmlElement).getDom() var succ = dom.children.length > 0 ? chance.pickone(dom.children) : null @@ -321,7 +322,7 @@ var xmlTransactions = [ d.remove() } } - }*/ + } ] test('y-xml: Random tests (10)', async function xmlRandom10 (t) {