From 290d3c8ffe477fe8406cec70492b47dd02378771 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Fri, 10 Nov 2017 18:41:10 -0800 Subject: [PATCH] support undefined as an attribute value --- src/Struct/ItemJSON.js | 17 +++++++++++++++-- src/Type/y-xml/utils.js | 20 ++++++++++++++++++++ test/y-map.tests.js | 4 ++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/Struct/ItemJSON.js b/src/Struct/ItemJSON.js index 0cc6c835..f8d22dd4 100644 --- a/src/Struct/ItemJSON.js +++ b/src/Struct/ItemJSON.js @@ -20,7 +20,13 @@ export default class ItemJSON extends Item { this._content = new Array(len) for (let i = 0; i < len; i++) { const ctnt = decoder.readVarString() - this._content[i] = JSON.parse(ctnt) + let parsed + if (ctnt === 'undefined') { + parsed = undefined + } else { + parsed = JSON.parse(ctnt) + } + this._content[i] = parsed } return missing } @@ -29,7 +35,14 @@ export default class ItemJSON extends Item { let len = this._content.length encoder.writeVarUint(len) for (let i = 0; i < len; i++) { - encoder.writeVarString(JSON.stringify(this._content[i])) + let encoded + let content = this._content[i] + if (content === undefined) { + encoded = 'undefined' + } else { + encoded = JSON.stringify(content) + } + encoder.writeVarString(encoded) } } _logString () { diff --git a/src/Type/y-xml/utils.js b/src/Type/y-xml/utils.js index a29dc0cf..e039b85d 100644 --- a/src/Type/y-xml/utils.js +++ b/src/Type/y-xml/utils.js @@ -136,6 +136,26 @@ export function applyChangesFromDom (dom) { } export function reflectChangesOnDom (events) { + // Make sure that no filtered attributes are applied to the structure + // if they were, delete them + events.forEach(event => { + const target = event.target + const keys = this._domFilter(target.nodeName, Array.from(event.keysChanged)) + if (keys === null) { + target._delete() + } else { + const removeKeys = new Set() // is a copy of event.keysChanged + event.keysChanged.forEach(key => { removeKeys.add(key) }) + keys.forEach(key => { + // remove all accepted keys from removeKeys + removeKeys.delete(key) + }) + // remove the filtered attribute + removeKeys.forEach(key => { + target.removeAttribute(key) + }) + } + }) this._mutualExclude(() => { events.forEach(event => { const yxml = event.target diff --git a/test/y-map.tests.js b/test/y-map.tests.js index 36b0983c..efebdc10 100644 --- a/test/y-map.tests.js +++ b/test/y-map.tests.js @@ -41,6 +41,8 @@ test('basic map tests', async function map0 (t) { test('Basic get&set of Map property (converge via sync)', async function map1 (t) { let { users, map0 } = await initArrays(t, { users: 2 }) map0.set('stuff', 'stuffy') + map0.set('undefined', undefined) + map0.set('null', null) t.compare(map0.get('stuff'), 'stuffy') await flushAll(t, users) @@ -48,6 +50,8 @@ test('Basic get&set of Map property (converge via sync)', async function map1 (t for (let user of users) { var u = user.get('map', Y.Map) t.compare(u.get('stuff'), 'stuffy') + t.assert(u.get('undefined') === undefined, 'undefined') + t.compare(u.get('null'), null, 'null') } await compareUsers(t, users) })