diff --git a/mozilla/layout/base/src/nsRangeList.cpp b/mozilla/layout/base/src/nsRangeList.cpp index 8a5a2e8481a..511fba6e095 100644 --- a/mozilla/layout/base/src/nsRangeList.cpp +++ b/mozilla/layout/base/src/nsRangeList.cpp @@ -784,7 +784,7 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent) weakNodeUsed = mDomSelections[SELECTION_NORMAL]->FetchAnchorNode(); } result = mDomSelections[SELECTION_NORMAL]->Collapse(weakNodeUsed,offsetused); - + return NS_OK; } break; case nsIDOMUIEvent::DOM_VK_RIGHT : case nsIDOMUIEvent::DOM_VK_DOWN : { @@ -797,12 +797,12 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent) weakNodeUsed = mDomSelections[SELECTION_NORMAL]->FetchFocusNode(); } result = mDomSelections[SELECTION_NORMAL]->Collapse(weakNodeUsed,offsetused); + return NS_OK; } break; } - if (keyEvent->keyCode == nsIDOMUIEvent::DOM_VK_UP || keyEvent->keyCode == nsIDOMUIEvent::DOM_VK_DOWN) - SetDesiredX(desiredX); - return NS_OK; +// if (keyEvent->keyCode == nsIDOMUIEvent::DOM_VK_UP || keyEvent->keyCode == nsIDOMUIEvent::DOM_VK_DOWN) +// SetDesiredX(desiredX); } offsetused = mDomSelections[SELECTION_NORMAL]->FetchFocusOffset(); @@ -816,7 +816,6 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent) pos.SetData(mTracker, desiredX, amount, eDirPrevious, offsetused, PR_FALSE,PR_TRUE); switch (keyEvent->keyCode){ case nsIDOMUIEvent::DOM_VK_RIGHT : - InvalidateDesiredX(); pos.mDirection = eDirNext; mHint = HINTLEFT;//stick to this line break; diff --git a/mozilla/layout/generic/nsFrame.cpp b/mozilla/layout/generic/nsFrame.cpp index e405fe3ac0e..56a53741b2b 100644 --- a/mozilla/layout/generic/nsFrame.cpp +++ b/mozilla/layout/generic/nsFrame.cpp @@ -2172,8 +2172,11 @@ nsFrame::PeekOffset(nsPeekOffsetStruct *aPos) if ((aPos->mDirection == eDirNext && lastFrame == this) ||(aPos->mDirection == eDirPrevious && firstFrame == this)) { - aPos->mPreferLeft = (PRBool)!(aPos->mPreferLeft);//drift to other side - aPos->mAmount = eSelectNoAmount; + if (aPos->mAmount != eSelectWord) + { + aPos->mPreferLeft = (PRBool)!(aPos->mPreferLeft);//drift to other side + aPos->mAmount = eSelectNoAmount; + } } nsCOMPtr frameTraversal; result = NS_NewFrameTraversal(getter_AddRefs(frameTraversal),LEAF,this); diff --git a/mozilla/layout/generic/nsTextFrame.cpp b/mozilla/layout/generic/nsTextFrame.cpp index c60d3879631..84e9832637e 100644 --- a/mozilla/layout/generic/nsTextFrame.cpp +++ b/mozilla/layout/generic/nsTextFrame.cpp @@ -2089,6 +2089,7 @@ nsTextFrame::PeekOffset(nsPeekOffsetStruct *aPos) case eSelectNoAmount: { aPos->mContentOffset = aPos->mStartOffset; + result = NS_OK; } break; @@ -2181,19 +2182,24 @@ nsTextFrame::PeekOffset(nsPeekOffsetStruct *aPos) if ((aPos->mEatingWS && !isWhitespace) || !aPos->mEatingWS){ aPos->mContentOffset = aPos->mStartOffset - contentLen; //check for whitespace next. - if (aPos->mContentOffset > mContentOffset) + if (isWhitespace && aPos->mContentOffset <= mContentOffset) + { keepSearching = PR_FALSE;//reached the beginning of a word - aPos->mEatingWS = !isWhitespace;//nowhite space, just eat chars. - while (isWhitespace && tx.GetPrevWord(PR_FALSE, wordLen, contentLen, isWhitespace, PR_FALSE)){ - aPos->mContentOffset -= contentLen; - aPos->mEatingWS = PR_FALSE; + aPos->mEatingWS = PR_FALSE;//if no real word then } - keepSearching = aPos->mContentOffset <= mContentOffset; - if (!isWhitespace){ - if (!keepSearching) - found = PR_TRUE; + else{ + aPos->mEatingWS = !isWhitespace;//nowhite space, just eat chars. + while (isWhitespace && tx.GetPrevWord(PR_FALSE, wordLen, contentLen, isWhitespace, PR_FALSE)){ + aPos->mContentOffset -= contentLen; + aPos->mEatingWS = PR_TRUE; + } + keepSearching = aPos->mContentOffset <= mContentOffset; + if (!isWhitespace){ + if (!keepSearching) + found = PR_TRUE; else aPos->mEatingWS = PR_TRUE; + } } } else { diff --git a/mozilla/layout/html/base/src/nsFrame.cpp b/mozilla/layout/html/base/src/nsFrame.cpp index e405fe3ac0e..56a53741b2b 100644 --- a/mozilla/layout/html/base/src/nsFrame.cpp +++ b/mozilla/layout/html/base/src/nsFrame.cpp @@ -2172,8 +2172,11 @@ nsFrame::PeekOffset(nsPeekOffsetStruct *aPos) if ((aPos->mDirection == eDirNext && lastFrame == this) ||(aPos->mDirection == eDirPrevious && firstFrame == this)) { - aPos->mPreferLeft = (PRBool)!(aPos->mPreferLeft);//drift to other side - aPos->mAmount = eSelectNoAmount; + if (aPos->mAmount != eSelectWord) + { + aPos->mPreferLeft = (PRBool)!(aPos->mPreferLeft);//drift to other side + aPos->mAmount = eSelectNoAmount; + } } nsCOMPtr frameTraversal; result = NS_NewFrameTraversal(getter_AddRefs(frameTraversal),LEAF,this); diff --git a/mozilla/layout/html/base/src/nsTextFrame.cpp b/mozilla/layout/html/base/src/nsTextFrame.cpp index c60d3879631..84e9832637e 100644 --- a/mozilla/layout/html/base/src/nsTextFrame.cpp +++ b/mozilla/layout/html/base/src/nsTextFrame.cpp @@ -2089,6 +2089,7 @@ nsTextFrame::PeekOffset(nsPeekOffsetStruct *aPos) case eSelectNoAmount: { aPos->mContentOffset = aPos->mStartOffset; + result = NS_OK; } break; @@ -2181,19 +2182,24 @@ nsTextFrame::PeekOffset(nsPeekOffsetStruct *aPos) if ((aPos->mEatingWS && !isWhitespace) || !aPos->mEatingWS){ aPos->mContentOffset = aPos->mStartOffset - contentLen; //check for whitespace next. - if (aPos->mContentOffset > mContentOffset) + if (isWhitespace && aPos->mContentOffset <= mContentOffset) + { keepSearching = PR_FALSE;//reached the beginning of a word - aPos->mEatingWS = !isWhitespace;//nowhite space, just eat chars. - while (isWhitespace && tx.GetPrevWord(PR_FALSE, wordLen, contentLen, isWhitespace, PR_FALSE)){ - aPos->mContentOffset -= contentLen; - aPos->mEatingWS = PR_FALSE; + aPos->mEatingWS = PR_FALSE;//if no real word then } - keepSearching = aPos->mContentOffset <= mContentOffset; - if (!isWhitespace){ - if (!keepSearching) - found = PR_TRUE; + else{ + aPos->mEatingWS = !isWhitespace;//nowhite space, just eat chars. + while (isWhitespace && tx.GetPrevWord(PR_FALSE, wordLen, contentLen, isWhitespace, PR_FALSE)){ + aPos->mContentOffset -= contentLen; + aPos->mEatingWS = PR_TRUE; + } + keepSearching = aPos->mContentOffset <= mContentOffset; + if (!isWhitespace){ + if (!keepSearching) + found = PR_TRUE; else aPos->mEatingWS = PR_TRUE; + } } } else {