When clicking the "Previous" button and the search string is at the end of the line, the search fails. Debugging shows that this is because in the function TextPagePrivate::findTextInternalBackward in textpage.cpp the line
if ( !comparer( str.midRef(offset, min ), query.midRef( j - min + 1, min ),
&resStrLen, &resQueryLen ) )
is buggy: e. g. if line in a PDF file consists of letters "abc" and the search string is also "abc", then str (the text for the last entity of the line) is "c\n", offset=0, min=2, j=2, so the code cited above compares "c\n" to "bc" and finds no match.
The similar line in findTextInternalForward is also buggy if it is possible for entities to have multi-character texts of other forms than <single character> + <newline>, but I don't know if that can happen.
Steps to Reproduce:
1. Open the attached file lineEnd.pdf.
2. Press F3 and type "abc". Okular highlights the first "abc".
3. Click Next. Okular highlights the next "abc".
4. Click Previous.
Okular finds no match (the search box takes a reddish color).
Okular should highlight the first "abc".
Created attachment 81599 [details]
lineEnd.pdf referred to in Steps to Reproduce
For completion: Jaan says he is interested in fixing this in bug 323263
Git commit dff8bf1b365f28c6a7b7d97e8ca2a0e579738619 by Albert Astals Cid, on behalf of Jaan Vajakas.
Committed on 18/10/2013 at 14:28.
Pushed by aacid into branch 'master'.
Improve searching code
Also simplified code a bit by removing unnecessary calls to toLower in TextPagePrivate::findTextInternalForward and TextPagePrivate::findTextInternalBackward I also fixed a small bug: the letter capital I with dot above (U+0130) did not match itself in case-insensitive mode on Qt 4.8.4 (U+0130 still does not match lowercase i (U+0069), which can be considered another bug, that I didn't fix (although this behavior conforms to the Unicode case folding rules)).
(I did not implement the Knuth-Morris-Pratt algorithm that I promised in a comment of Bug 323263 because on second thought I find that the win, if any, would probably be negligible except for some very special documents and special query strings.)
Related: bug 323263
M +155 -136 core/textpage.cpp
M +11 -5 core/textpage_p.h
M +307 -1 tests/searchtest.cpp
M +1 -0 ui/videowidget.cpp