0
Fork 0
mirror of https://github.com/fastmail/Squire.git synced 2024-12-22 23:40:35 -05:00

Limit the undo stack size

Add an undo configuration.
If the document is larger than the configured threshold, then limit the
number of undo states that can be saved to the configured amount.
Defaults to no limit.
This commit is contained in:
Andy Kauffman 2016-05-31 15:26:22 -04:00
parent 9dcc4fb79f
commit bb8cbe109d
3 changed files with 62 additions and 2 deletions

View file

@ -2435,6 +2435,10 @@ proto.setConfig = function ( config ) {
ol: null, ol: null,
li: null, li: null,
a: null a: null
},
undo: {
documentSizeThreshold: -1, // -1 means no threshold
undoLimit: -1 // -1 means no limit
} }
}, config ); }, config );
@ -2531,6 +2535,7 @@ proto.destroy = function () {
var l = instances.length; var l = instances.length;
var events = this._events; var events = this._events;
var type; var type;
for ( type in events ) { for ( type in events ) {
this.removeEventListener( type ); this.removeEventListener( type );
} }
@ -2542,6 +2547,11 @@ proto.destroy = function () {
instances.splice( l, 1 ); instances.splice( l, 1 );
} }
} }
// Destroy undo stack
this._undoIndex = -1;
this._undoStack = [];
this._undoStackLength = 0;
}; };
proto.handleEvent = function ( event ) { proto.handleEvent = function ( event ) {
@ -2969,6 +2979,12 @@ proto._docWasChanged = function () {
this.fireEvent( 'input' ); this.fireEvent( 'input' );
}; };
// Gets the size of the document in bytes.
var documentSizeInBytes = function () {
// Javascript uses 2 bytes per character
return this._getHTML().length * 2;
};
// Leaves bookmark // Leaves bookmark
proto._recordUndoState = function ( range ) { proto._recordUndoState = function ( range ) {
// Don't record if we're already in an undo state // Don't record if we're already in an undo state
@ -2982,6 +2998,20 @@ proto._recordUndoState = function ( range ) {
undoStack.length = this._undoStackLength = undoIndex; undoStack.length = this._undoStackLength = undoIndex;
} }
var undoThreshold = this._config.undo.documentSizeThreshold,
undoLimit = this._config.undo.undoLimit;
// If this document is above the configured size threshold, limit the number
// of saved undo states.
if( undoThreshold > -1 && undoThreshold <= documentSizeInBytes.call( this ) ) {
if( undoLimit > -1 && undoLimit < undoIndex ) {
undoStack.splice( 0, undoIndex - undoLimit );
undoIndex = this._undoIndex = undoLimit;
this._undoStackLength = undoStack.length;
}
}
// Write out data // Write out data
if ( range ) { if ( range ) {
this._saveRangeToBookmark( range ); this._saveRangeToBookmark( range );

File diff suppressed because one or more lines are too long

View file

@ -167,6 +167,10 @@ proto.setConfig = function ( config ) {
ol: null, ol: null,
li: null, li: null,
a: null a: null
},
undo: {
documentSizeThreshold: -1, // -1 means no threshold
undoLimit: -1 // -1 means no limit
} }
}, config ); }, config );
@ -263,6 +267,7 @@ proto.destroy = function () {
var l = instances.length; var l = instances.length;
var events = this._events; var events = this._events;
var type; var type;
for ( type in events ) { for ( type in events ) {
this.removeEventListener( type ); this.removeEventListener( type );
} }
@ -274,6 +279,11 @@ proto.destroy = function () {
instances.splice( l, 1 ); instances.splice( l, 1 );
} }
} }
// Destroy undo stack
this._undoIndex = -1;
this._undoStack = [];
this._undoStackLength = 0;
}; };
proto.handleEvent = function ( event ) { proto.handleEvent = function ( event ) {
@ -701,6 +711,12 @@ proto._docWasChanged = function () {
this.fireEvent( 'input' ); this.fireEvent( 'input' );
}; };
// Gets the size of the document in bytes.
var documentSizeInBytes = function () {
// Javascript uses 2 bytes per character
return this._getHTML().length * 2;
};
// Leaves bookmark // Leaves bookmark
proto._recordUndoState = function ( range ) { proto._recordUndoState = function ( range ) {
// Don't record if we're already in an undo state // Don't record if we're already in an undo state
@ -714,6 +730,20 @@ proto._recordUndoState = function ( range ) {
undoStack.length = this._undoStackLength = undoIndex; undoStack.length = this._undoStackLength = undoIndex;
} }
var undoThreshold = this._config.undo.documentSizeThreshold,
undoLimit = this._config.undo.undoLimit;
// If this document is above the configured size threshold, limit the number
// of saved undo states.
if( undoThreshold > -1 && undoThreshold <= documentSizeInBytes.call( this ) ) {
if( undoLimit > -1 && undoLimit < undoIndex ) {
undoStack.splice( 0, undoIndex - undoLimit );
undoIndex = this._undoIndex = undoLimit;
this._undoStackLength = undoStack.length;
}
}
// Write out data // Write out data
if ( range ) { if ( range ) {
this._saveRangeToBookmark( range ); this._saveRangeToBookmark( range );