skip formatting cleanup when the ytext doesnt have any ContentFormat

also skip iterating the deleted structs entirely when none of the changed ytext had ContentFormat
This commit is contained in:
Noel Levy 2023-06-20 14:23:03 -07:00
parent c398448152
commit 08250a9a6c

View File

@ -508,14 +508,16 @@ export const cleanupYTextAfterTransaction = transaction => {
if (item instanceof GC || needFullCleanup.has(/** @type {YText} */ (item.parent))) { if (item instanceof GC || needFullCleanup.has(/** @type {YText} */ (item.parent))) {
return return
} }
const parent = /** @type {YText} */ (item.parent) const parent = item.parent
if (item.content.constructor === ContentFormat) { if (parent instanceof YText && parent._needFormattingCleanup) {
needFullCleanup.add(parent) if (item.content.constructor === ContentFormat) {
} else { needFullCleanup.add(parent)
// If no formatting attribute was inserted or deleted, we can make due with contextless } else {
// formatting cleanups. // If no formatting attribute was inserted or deleted, we can make due with contextless
// Contextless: it is not necessary to compute currentAttributes for the affected position. // formatting cleanups.
cleanupContextlessFormattingGap(t, item) // Contextless: it is not necessary to compute currentAttributes for the affected position.
cleanupContextlessFormattingGap(t, item)
}
} }
}) })
// If a formatting item was inserted, we simply clean the whole type. // If a formatting item was inserted, we simply clean the whole type.
@ -862,6 +864,7 @@ export class YText extends AbstractType {
* @type {Array<ArraySearchMarker>} * @type {Array<ArraySearchMarker>}
*/ */
this._searchMarker = [] this._searchMarker = []
this._needFormattingCleanup = false
} }
/** /**
@ -910,9 +913,18 @@ export class YText extends AbstractType {
super._callObserver(transaction, parentSubs) super._callObserver(transaction, parentSubs)
const event = new YTextEvent(this, transaction, parentSubs) const event = new YTextEvent(this, transaction, parentSubs)
callTypeObservers(this, transaction, event) callTypeObservers(this, transaction, event)
this._needFormattingCleanup = false
// If a remote change happened, we try to cleanup potential formatting duplicates. // If a remote change happened, we try to cleanup potential formatting duplicates.
if (!transaction.local) { if (!transaction.local && !transaction._needFormattingCleanup) {
transaction._needFormattingCleanup = true let item = this._start
while (item) {
if (!item.deleted && item.content.constructor === ContentFormat) {
this._needFormattingCleanup = true
transaction._needFormattingCleanup = true
break
}
item = item.right
}
} }
} }