fix concurrent formatting / cleanup bug
This commit is contained in:
parent
8ce107bd17
commit
24eddb2d75
@ -369,7 +369,7 @@ const cleanupFormattingGap = (transaction, start, curr, startAttributes, currAtt
|
|||||||
// Either this format is overwritten or it is not necessary because the attribute already existed.
|
// Either this format is overwritten or it is not necessary because the attribute already existed.
|
||||||
start.delete(transaction)
|
start.delete(transaction)
|
||||||
cleanups++
|
cleanups++
|
||||||
if (!reachedEndOfCurr && (currAttributes.get(key) || null) === value) {
|
if (!reachedEndOfCurr && (currAttributes.get(key) || null) === value && (startAttributes.get(key) || null) !== value) {
|
||||||
currAttributes.delete(key)
|
currAttributes.delete(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -693,7 +693,7 @@ export class YTextEvent extends YEvent {
|
|||||||
} else {
|
} else {
|
||||||
attributes[key] = value
|
attributes[key] = value
|
||||||
}
|
}
|
||||||
} else {
|
} else if (value !== null) {
|
||||||
item.delete(transaction)
|
item.delete(transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -719,7 +719,7 @@ export class YTextEvent extends YEvent {
|
|||||||
} else {
|
} else {
|
||||||
attributes[key] = value
|
attributes[key] = value
|
||||||
}
|
}
|
||||||
} else {
|
} else if (attr !== null) { // this will be cleaned up automatically by the contextless cleanup function
|
||||||
item.delete(transaction)
|
item.delete(transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,10 @@ import * as math from 'lib0/math'
|
|||||||
const { init, compare } = Y
|
const { init, compare } = Y
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* In this test we are mainly interested in the cleanup behavior and whether the resulting delta makes sense.
|
||||||
|
* It is fine if the resulting delta is not minimal. But applying the delta to a rich-text editor should result in a
|
||||||
|
* synced document.
|
||||||
|
*
|
||||||
* @param {t.TestCase} tc
|
* @param {t.TestCase} tc
|
||||||
*/
|
*/
|
||||||
export const testDeltaAfterConcurrentFormatting = tc => {
|
export const testDeltaAfterConcurrentFormatting = tc => {
|
||||||
@ -14,12 +18,17 @@ export const testDeltaAfterConcurrentFormatting = tc => {
|
|||||||
testConnector.flushAllMessages()
|
testConnector.flushAllMessages()
|
||||||
text0.format(0, 3, { bold: true })
|
text0.format(0, 3, { bold: true })
|
||||||
text1.format(2, 2, { bold: true })
|
text1.format(2, 2, { bold: true })
|
||||||
let delta = null
|
/**
|
||||||
|
* @type {any}
|
||||||
|
*/
|
||||||
|
const deltas = []
|
||||||
text1.observe(event => {
|
text1.observe(event => {
|
||||||
delta = event.delta
|
if (event.delta.length > 0) {
|
||||||
|
deltas.push(event.delta)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
testConnector.flushAllMessages()
|
testConnector.flushAllMessages()
|
||||||
t.compare(delta, [])
|
t.compare(deltas, [[{ retain: 3, attributes: { bold: true } }, { retain: 2, attributes: { bold: null } }]])
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user