Bug 1232322. Allow caret movement to stop at break opportunities induced by collapsed whitespace. r=mats
MozReview-Commit-ID: Eu85ceDbIu8
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -7464,27 +7464,25 @@ ClusterIterator::NextCluster()
gfxTextRun* textRun = mTextFrame->GetTextRun(nsTextFrame::eInflated);
mHaveWordBreak = false;
while (true) {
bool keepGoing = false;
if (mDirection > 0) {
if (mIterator.GetOriginalOffset() >= mTrimmed.GetEnd())
return false;
- keepGoing = mIterator.IsOriginalCharSkipped() ||
- mIterator.GetOriginalOffset() < mTrimmed.mStart ||
+ keepGoing = mIterator.GetOriginalOffset() < mTrimmed.mStart ||
!textRun->IsClusterStart(mIterator.GetSkippedOffset());
mCharIndex = mIterator.GetOriginalOffset();
mIterator.AdvanceOriginal(1);
} else {
if (mIterator.GetOriginalOffset() <= mTrimmed.mStart)
return false;
mIterator.AdvanceOriginal(-1);
- keepGoing = mIterator.IsOriginalCharSkipped() ||
- mIterator.GetOriginalOffset() >= mTrimmed.GetEnd() ||
+ keepGoing = mIterator.GetOriginalOffset() >= mTrimmed.GetEnd() ||
!textRun->IsClusterStart(mIterator.GetSkippedOffset());
mCharIndex = mIterator.GetOriginalOffset();
}
if (mWordBreaks[GetBeforeOffset() - mTextFrame->GetContentOffset()]) {
mHaveWordBreak = true;
}
if (!keepGoing)
--- a/layout/generic/test/test_movement_by_words.html
+++ b/layout/generic/test/test_movement_by_words.html
@@ -180,16 +180,24 @@ function test1() {
// test for bug 1066756
editor.innerHTML = "hello" + ModifierColon + " wo" + ModifierColon + "rld";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 13);
testLeft(editor.firstChild, 7);
testLeft(editor.firstChild, 0);
+ // test for bug 1232322
+ editor.innerHTML = "Hello <span></span> Kitty";
+ sel.collapse(editor.firstChild, 0);
+ testRight(editor.firstChild, 5);
+ testRight(editor.firstChild.nextSibling.nextSibling, 6);
+ testLeft(editor.firstChild.nextSibling.nextSibling, 1);
+ testLeft(editor.firstChild, 0);
+
// test basic word movement with eat_space_next_to_word true.
setPrefs(true, true, test2);
}
function test2() {
editor.innerHTML = "Hello Kitty";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 6);