even more delayed visitedLink initialization in event bubbling
This commit is contained in:
parent
6e95c19b3e
commit
c7f069318e
@ -244,11 +244,9 @@ export const callTypeObservers = (type, transaction, event, visitedLinks = null)
|
|||||||
if (type._item === null) {
|
if (type._item === null) {
|
||||||
break
|
break
|
||||||
} else if (type._item.linkedBy !== null) {
|
} else if (type._item.linkedBy !== null) {
|
||||||
if (visitedLinks === null) {
|
|
||||||
visitedLinks = new Set()
|
|
||||||
}
|
|
||||||
for (let link of type._item.linkedBy) {
|
for (let link of type._item.linkedBy) {
|
||||||
if (!visitedLinks.has(link)) {
|
if (visitedLinks === null || !visitedLinks.has(link)) {
|
||||||
|
visitedLinks = visitedLinks !== null ? visitedLinks : new Set()
|
||||||
visitedLinks.add(link)
|
visitedLinks.add(link)
|
||||||
// recursive call
|
// recursive call
|
||||||
callTypeObservers(link, transaction, /** @type {any} */ (event), visitedLinks)
|
callTypeObservers(link, transaction, /** @type {any} */ (event), visitedLinks)
|
||||||
|
@ -213,6 +213,16 @@ export const testObserveArray = tc => {
|
|||||||
export const testObserveTransitive = tc => {
|
export const testObserveTransitive = tc => {
|
||||||
// test observers in a face of linked chains of values
|
// test observers in a face of linked chains of values
|
||||||
const doc = new Y.Doc()
|
const doc = new Y.Doc()
|
||||||
|
|
||||||
|
/*
|
||||||
|
Structure:
|
||||||
|
- map1
|
||||||
|
- link-key: <=+-+
|
||||||
|
- map2: | |
|
||||||
|
- key: value1-+ |
|
||||||
|
- link-link: <--+
|
||||||
|
*/
|
||||||
|
|
||||||
const map1 = doc.getMap('map1')
|
const map1 = doc.getMap('map1')
|
||||||
const map2 = doc.getMap('map2')
|
const map2 = doc.getMap('map2')
|
||||||
|
|
||||||
@ -237,6 +247,18 @@ export const testObserveTransitive = tc => {
|
|||||||
export const testObserveTransitive2 = tc => {
|
export const testObserveTransitive2 = tc => {
|
||||||
// test observers in a face of multi-layer linked chains of values
|
// test observers in a face of multi-layer linked chains of values
|
||||||
const doc = new Y.Doc()
|
const doc = new Y.Doc()
|
||||||
|
|
||||||
|
/*
|
||||||
|
Structure:
|
||||||
|
- map1
|
||||||
|
- link-key: <=+-+
|
||||||
|
- map2: | |
|
||||||
|
- key: value1-+ |
|
||||||
|
- link-link: <==+--+
|
||||||
|
- map3: |
|
||||||
|
- link-link-link:<-+
|
||||||
|
*/
|
||||||
|
|
||||||
const map1 = doc.getMap('map1')
|
const map1 = doc.getMap('map1')
|
||||||
const map2 = doc.getMap('map2')
|
const map2 = doc.getMap('map2')
|
||||||
const map3 = doc.getMap('map3')
|
const map3 = doc.getMap('map3')
|
||||||
@ -265,6 +287,14 @@ export const testObserveTransitive2 = tc => {
|
|||||||
export const testDeepObserveMap = tc => {
|
export const testDeepObserveMap = tc => {
|
||||||
// test observers in a face of linked chains of values
|
// test observers in a face of linked chains of values
|
||||||
const doc = new Y.Doc()
|
const doc = new Y.Doc()
|
||||||
|
/*
|
||||||
|
Structure:
|
||||||
|
- map (observed):
|
||||||
|
- link:<----+
|
||||||
|
- array: |
|
||||||
|
0: nested:-+
|
||||||
|
- key: value
|
||||||
|
*/
|
||||||
const map = doc.getMap('map')
|
const map = doc.getMap('map')
|
||||||
const array = doc.getArray('array')
|
const array = doc.getArray('array')
|
||||||
|
|
||||||
@ -305,6 +335,14 @@ export const testDeepObserveMap = tc => {
|
|||||||
export const testDeepObserveArray = tc => {
|
export const testDeepObserveArray = tc => {
|
||||||
// test observers in a face of linked chains of values
|
// test observers in a face of linked chains of values
|
||||||
const doc = new Y.Doc()
|
const doc = new Y.Doc()
|
||||||
|
/*
|
||||||
|
Structure:
|
||||||
|
- map:
|
||||||
|
- nested: --------+
|
||||||
|
- key: value |
|
||||||
|
- array (observed): |
|
||||||
|
0: <--------------+
|
||||||
|
*/
|
||||||
const map = doc.getMap('map')
|
const map = doc.getMap('map')
|
||||||
const array = doc.getArray('array')
|
const array = doc.getArray('array')
|
||||||
|
|
||||||
@ -329,7 +367,7 @@ export const testDeepObserveArray = tc => {
|
|||||||
nested.set('key', 'value2')
|
nested.set('key', 'value2')
|
||||||
t.compare(events.length, 1)
|
t.compare(events.length, 1)
|
||||||
t.compare(events[0].target, nested)
|
t.compare(events[0].target, nested)
|
||||||
t.compare(events[0].keys, new Map([['key', {action:'update', oldValue: 'value'}]]))
|
t.compare(events[0].keys, new Map([['key', {action:'update', oldValue: undefined}]]))
|
||||||
|
|
||||||
// delete entry in linked map
|
// delete entry in linked map
|
||||||
nested.delete('key')
|
nested.delete('key')
|
||||||
@ -343,13 +381,57 @@ export const testDeepObserveArray = tc => {
|
|||||||
t.compare(events[0].target, map)
|
t.compare(events[0].target, map)
|
||||||
t.compare(events[0].keys, new Map([['nested', {action:'delete', oldValue: undefined}]]))
|
t.compare(events[0].keys, new Map([['nested', {action:'delete', oldValue: undefined}]]))
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @param {t.TestCase} tc
|
||||||
|
*/
|
||||||
|
export const testMapDeepObserve = tc => {
|
||||||
|
const doc = new Y.Doc()
|
||||||
|
const outer = doc.getMap('outer')
|
||||||
|
const inner = new Y.Map()
|
||||||
|
outer.set('inner', inner)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Array<any>}
|
||||||
|
*/
|
||||||
|
let events = []
|
||||||
|
outer.observeDeep((e) => events = e)
|
||||||
|
|
||||||
|
inner.set('key', 'value1')
|
||||||
|
t.compare(events.length, 1)
|
||||||
|
t.compare(events[0].target, inner)
|
||||||
|
t.compare(events[0].keys, new Map([['key', {action:'add', oldValue: undefined}]]))
|
||||||
|
|
||||||
|
events = []
|
||||||
|
inner.set('key', 'value2')
|
||||||
|
t.compare(events.length, 1)
|
||||||
|
t.compare(events[0].target, inner)
|
||||||
|
t.compare(events[0].keys, new Map([['key', {action:'update', oldValue: undefined}]]))
|
||||||
|
|
||||||
|
events = []
|
||||||
|
inner.delete('key')
|
||||||
|
t.compare(events.length, 1)
|
||||||
|
t.compare(events[0].target, inner)
|
||||||
|
t.compare(events[0].keys, new Map([['key', {action:'delete', oldValue: undefined}]]))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {t.TestCase} tc
|
* @param {t.TestCase} tc
|
||||||
*/
|
*/
|
||||||
export const testDeepObserveRecursive = tc => {
|
export const testDeepObserveRecursive = tc => {
|
||||||
// test observers in a face of linked chains of values
|
// test observers in a face of cycled chains of values
|
||||||
const doc = new Y.Doc()
|
const doc = new Y.Doc()
|
||||||
|
/*
|
||||||
|
Structure:
|
||||||
|
array (observed):
|
||||||
|
m0:--------+
|
||||||
|
- k1:<-+ |
|
||||||
|
| |
|
||||||
|
m1------+ |
|
||||||
|
- k2:<-+ |
|
||||||
|
| |
|
||||||
|
m2------+ |
|
||||||
|
- k0:<----+
|
||||||
|
*/
|
||||||
const root = doc.getArray('array')
|
const root = doc.getArray('array')
|
||||||
|
|
||||||
const m0 = new Y.Map()
|
const m0 = new Y.Map()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user