diff --git a/addons/addon-search/src/SearchEngine.ts b/addons/addon-search/src/SearchEngine.ts index 3f4efb0cd..c14822d21 100644 --- a/addons/addon-search/src/SearchEngine.ts +++ b/addons/addon-search/src/SearchEngine.ts @@ -292,7 +292,17 @@ export class SearchEngine { let searchStringLine = stringLine; if (!searchOptions.regex) { searchTerm = searchOptions.caseSensitive ? term : term.toLowerCase(); - searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase(); + if (searchOptions.caseSensitive) { + searchStringLine = stringLine; + } else { + let lowerLine = cache[2]; + if (!lowerLine) { + lowerLine = stringLine.toLowerCase(); + cache[2] = lowerLine; + this._lineCache.setLineInCache(row, cache); + } + searchStringLine = lowerLine; + } } let resultIndex = -1; diff --git a/addons/addon-search/src/SearchLineCache.ts b/addons/addon-search/src/SearchLineCache.ts index 526f4bfcc..714b52203 100644 --- a/addons/addon-search/src/SearchLineCache.ts +++ b/addons/addon-search/src/SearchLineCache.ts @@ -15,7 +15,11 @@ export type LineCacheEntry = [ /** * The offsets where each line starts when the entry describes a wrapped line. */ - lineOffsets: number[] + lineOffsets: number[], + /** + * Lowercased line text for case-insensitive searches, lazily populated. + */ + lineAsLower?: string ]; /**