-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[fix] Ignore default line attribs when detecting edges of changeset (#…
…3420) When comparing original content with the changes made by the user, we need to ignore some line attribs that are added by content collector, otherwise we would consider the change started on the first char of the line -- the '*' that is added when line has line attribs. In order to be able to handle both #3354 and #3118, we need to take into account both the styles attribs (to fix #3354) and the line attribs defined by any of the plugins (to fix #3118), but we can ignore those extra line attribs that are added by Etherpad and do not add any functionality (`'lmkr', 'insertorder', 'start'`).
- Loading branch information
Showing
3 changed files
with
117 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
describe('author of pad edition', function() { | ||
var REGULAR_LINE = 0; | ||
var LINE_WITH_ORDERED_LIST = 1; | ||
var LINE_WITH_UNORDERED_LIST = 2; | ||
|
||
// author 1 creates a new pad with some content (regular lines and lists) | ||
before(function(done) { | ||
var padId = helper.newPad(function() { | ||
// make sure pad has at least 3 lines | ||
var $firstLine = helper.padInner$('div').first(); | ||
var threeLines = ['regular line', 'line with ordered list', 'line with unordered list'].join('<br>'); | ||
$firstLine.html(threeLines); | ||
|
||
// wait for lines to be processed by Etherpad | ||
helper.waitFor(function() { | ||
var $lineWithUnorderedList = getLine(LINE_WITH_UNORDERED_LIST); | ||
return $lineWithUnorderedList.text() === 'line with unordered list'; | ||
}).done(function() { | ||
// create the unordered list | ||
var $lineWithUnorderedList = getLine(LINE_WITH_UNORDERED_LIST); | ||
$lineWithUnorderedList.sendkeys('{selectall}'); | ||
|
||
var $insertUnorderedListButton = helper.padChrome$('.buttonicon-insertunorderedlist'); | ||
$insertUnorderedListButton.click(); | ||
|
||
helper.waitFor(function() { | ||
var $lineWithUnorderedList = getLine(LINE_WITH_UNORDERED_LIST); | ||
return $lineWithUnorderedList.find('ul li').length === 1; | ||
}).done(function() { | ||
// create the ordered list | ||
var $lineWithOrderedList = getLine(LINE_WITH_ORDERED_LIST); | ||
$lineWithOrderedList.sendkeys('{selectall}'); | ||
|
||
var $insertOrderedListButton = helper.padChrome$('.buttonicon-insertorderedlist'); | ||
$insertOrderedListButton.click(); | ||
|
||
helper.waitFor(function() { | ||
var $lineWithOrderedList = getLine(LINE_WITH_ORDERED_LIST); | ||
return $lineWithOrderedList.find('ol li').length === 1; | ||
}).done(function() { | ||
// Reload pad, to make changes as a second user. Need a timeout here to make sure | ||
// all changes were saved before reloading | ||
setTimeout(function() { | ||
helper.newPad(done, padId); | ||
}, 1000); | ||
}); | ||
}); | ||
}); | ||
}); | ||
this.timeout(60000); | ||
}); | ||
|
||
// author 2 makes some changes on the pad | ||
it('marks only the new content as changes of the second user on a regular line', function(done) { | ||
changeLineAndCheckOnlyThatChangeIsFromThisAuthor(REGULAR_LINE, 'x', done); | ||
}); | ||
|
||
it('marks only the new content as changes of the second user on a line with ordered list', function(done) { | ||
changeLineAndCheckOnlyThatChangeIsFromThisAuthor(LINE_WITH_ORDERED_LIST, 'y', done); | ||
}); | ||
|
||
it('marks only the new content as changes of the second user on a line with unordered list', function(done) { | ||
changeLineAndCheckOnlyThatChangeIsFromThisAuthor(LINE_WITH_UNORDERED_LIST, 'z', done); | ||
}); | ||
|
||
/* ********************** Helper functions ************************ */ | ||
var getLine = function(lineNumber) { | ||
return helper.padInner$('div').eq(lineNumber); | ||
} | ||
|
||
var getAuthorFromClassList = function(classes) { | ||
return classes.find(function(cls) { | ||
return cls.startsWith('author'); | ||
}); | ||
} | ||
|
||
var changeLineAndCheckOnlyThatChangeIsFromThisAuthor = function(lineNumber, textChange, done) { | ||
// get original author class | ||
var classes = getLine(lineNumber).find('span').first().attr('class').split(' '); | ||
var originalAuthor = getAuthorFromClassList(classes); | ||
|
||
// make change on target line | ||
var $regularLine = getLine(lineNumber); | ||
helper.selectLines($regularLine, $regularLine, 2, 2); // place caret after 2nd char of line | ||
$regularLine.sendkeys(textChange); | ||
|
||
// wait for change to be processed by Etherpad | ||
var otherAuthorsOfLine; | ||
helper.waitFor(function() { | ||
var authorsOfLine = getLine(lineNumber).find('span').map(function() { | ||
return getAuthorFromClassList($(this).attr('class').split(' ')); | ||
}).get(); | ||
otherAuthorsOfLine = authorsOfLine.filter(function(author) { | ||
return author !== originalAuthor; | ||
}); | ||
var lineHasChangeOfThisAuthor = otherAuthorsOfLine.length > 0; | ||
return lineHasChangeOfThisAuthor; | ||
}).done(function() { | ||
var thisAuthor = otherAuthorsOfLine[0]; | ||
var $changeOfThisAuthor = getLine(lineNumber).find('span.' + thisAuthor); | ||
expect($changeOfThisAuthor.text()).to.be(textChange); | ||
done(); | ||
}); | ||
} | ||
}); |