| Summary: | "Find previous" fails at end of line | ||
|---|---|---|---|
| Product: | [Applications] okular | Reporter: | Jaan Vajakas <jaanvajakas> |
| Component: | general | Assignee: | Okular developers <okular-devel> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | aacid |
| Priority: | NOR | ||
| Version First Reported In: | 0.17.60 | ||
| Target Milestone: | --- | ||
| Platform: | unspecified | ||
| OS: | Linux | ||
| Latest Commit: | http://commits.kde.org/okular/dff8bf1b365f28c6a7b7d97e8ca2a0e579738619 | Version Fixed/Implemented In: | 4.12.0 |
| Sentry Crash Report: | |||
| Attachments: | lineEnd.pdf referred to in Steps to Reproduce | ||
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 REVIEW: 112135 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 http://commits.kde.org/okular/dff8bf1b365f28c6a7b7d97e8ca2a0e579738619 |
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. Reproducible: Always 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. Actual Results: Okular finds no match (the search box takes a reddish color). Expected Results: Okular should highlight the first "abc".