Merge pull request +7491 from c9/fix/undo

fix tabs with empty undo history appearing as changed
pull/117/merge
Lennart Kats 2015-05-29 11:34:20 +02:00
commit 81e60d8e82
3 zmienionych plików z 46 dodań i 15 usunięć

Wyświetl plik

@ -348,23 +348,33 @@ define(function(require, exports, module) {
},
getState: function() {
var aceUndo = this.$aceUndo;
var mark = -1;
var mark = -2;
var aceMark = aceUndo.mark;
var stack = [];
function transform(deltaSet) {
var newDelta = deltaSet.filter(function (d) {
if (!deltaSet || !deltaSet.filter) {
errorHandler.reportError("Misformed ace delta", {
delta: deltaSet
});
return;
}
var newDelta = deltaSet.filter(function(d) {
if (d.id == aceMark) mark = stack.length;
return d.action == "insert" || d.action == "remove";
});
stack.push(newDelta);
if (newDelta.length)
stack.push(newDelta);
}
aceUndo.$undoStack.forEach(transform);
var pos = stack.length - 1;
if (pos == -1 && aceUndo.isAtBookmark())
mark = pos;
if (aceUndo.$redoStackBaseRev == aceUndo.$rev)
aceUndo.$redoStack.forEach(transform);
return {
stack: stack,
mark: mark,
position: aceUndo.$undoStack.length - 1
position: pos,
stack: stack
};
},
setState: function(e, silent) {
@ -374,18 +384,24 @@ define(function(require, exports, module) {
var pos = e.position + 1;
var undo = stack.slice(0, pos);
var redo = stack.slice(pos);
aceUndo.$undoStack = undo.filter(function(x) {
return x.length;
}).map(updateDeltas);
aceUndo.$redoStack = redo.filter(function(x) {
return x.length;
}).map(updateDeltas);
stack = aceUndo.$undoStack;
var maxRev = aceUndo.$maxRev;
function check(x) {
if (!x.length) return false;
if (!x[0].id || x[0].id < maxRev) {
x[0].id = maxRev++;
} else {
maxRev = x[0].id;
}
return true;
}
aceUndo.$undoStack = undo.map(updateDeltas).filter(check);
aceUndo.$redoStack = redo.map(updateDeltas).filter(check);
var lastDeltaGroup = stack[stack.length - 1];
var lastRev = lastDeltaGroup && lastDeltaGroup[0].id || 0;
var lastRev = lastDeltaGroup && lastDeltaGroup[0] && lastDeltaGroup[0].id || 0;
aceUndo.$rev = lastRev;
aceUndo.$redoStackBaseRev = aceUndo.$rev;
aceUndo.$maxRev = Math.max(aceUndo.$maxRev, lastRev);
aceUndo.$maxRev = Math.max(maxRev, lastRev);
var markedRev = marked && marked.id;
if (markedRev != null)
this.$aceUndo.bookmark(markedRev);

Wyświetl plik

@ -526,6 +526,21 @@ require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai)
expect.html(doc.tab).text("50");
done();
});
it('should not loose undomanager state', function(done) {
var u = editor.activeDocument.undoManager;
u.setState({mark: -1, position: -1, stack: []});
var state = u.getState();
expect(state.mark).to.equal(-1);
expect(state.position).to.equal(-1);
expect(state.stack.length).to.equal(0);
u.setState({mark: -2, position: -1, stack: []});
state = u.getState();
expect(state.mark).to.equal(-2);
expect(state.position).to.equal(-1);
expect(state.stack.length).to.equal(0);
done();
});
});
// @todo test split api and menu

Wyświetl plik

@ -10,7 +10,7 @@ define(function(require, module, exports) {
var plugin = new Plugin("Ajax.org", main.consumes);
var emit = plugin.getEmitter();
var position = -1, mark = -2, stack = [];
var position = -1, mark = -1, stack = [];
if (options)
setState(options);