From 2a452ac61e4593d84d76131937a94363b6ceffa6 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Wed, 26 Nov 2025 16:57:31 -0500 Subject: [PATCH] Add RSS feed support in Reader search --- .../Helpers/FaviconService.swift | 2 +- RELEASE-NOTES.txt | 1 + .../Reader/Controllers/ReaderFeedCell.swift | 22 +++++++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Modules/Sources/AsyncImageKit/Helpers/FaviconService.swift b/Modules/Sources/AsyncImageKit/Helpers/FaviconService.swift index e8c838b3fe23..7bbd7df58013 100644 --- a/Modules/Sources/AsyncImageKit/Helpers/FaviconService.swift +++ b/Modules/Sources/AsyncImageKit/Helpers/FaviconService.swift @@ -74,7 +74,7 @@ private final class FaviconCache: @unchecked Sendable { } private let regex: NSRegularExpression? = { - let pattern = "]*rel=\"apple-touch-icon\"[^>]*href=\"([^\"]+)\"[^>]*>" + let pattern = "]*rel=\"apple-touch-icon(?:-precomposed)\"[^>]*href=\"([^\"]+)\"[^>]*>" return try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) }() diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index abc925c6a546..3868898abe39 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -15,6 +15,7 @@ * [*] Add permalink preview in the slug editor and make other improvements [#24949] * [*] Add two accessible font sizes to Reader display settings [#25013] * [*] Fix an issue with Reader failing to parse some search results [#25022] +* [*] Fix search for RSS feeds in Reader [#25023] * [*] Add "Taxonomies" to Site Settings [#24955] * [*] Update "Categories" picker to indicate multiple selection [#24952] * [*] Fix overly long related post titles in Reader [#25011] diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderFeedCell.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderFeedCell.swift index 6e0df7b8d884..530f6f6c74d2 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderFeedCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderFeedCell.swift @@ -4,10 +4,11 @@ import WordPressKit struct ReaderFeedCell: View { let feed: ReaderFeed + @State private var faviconURL: URL? var body: some View { HStack(alignment: .center, spacing: 16) { - SiteIconView(viewModel: .init(feed: feed)) + SiteIconView(viewModel: .init(feed: feed, faviconURL: faviconURL)) .frame(width: 40, height: 40) VStack(alignment: .leading) { @@ -23,6 +24,21 @@ struct ReaderFeedCell: View { } } } + .task { + await loadFaviconIfNeeded() + } + } + + private func loadFaviconIfNeeded() async { + guard feed.blavatarURL == nil, let url = feed.url else { + return + } + + if let cachedFavicon = FaviconService.shared.cachedFavicon(forURL: url) { + faviconURL = cachedFavicon + } else { + faviconURL = try? await FaviconService.shared.favicon(forURL: url) + } } var title: String { @@ -41,10 +57,12 @@ struct ReaderFeedCell: View { } extension SiteIconViewModel { - init(feed: ReaderFeed, size: Size = .regular) { + init(feed: ReaderFeed, faviconURL: URL? = nil, size: Size = .regular) { self.init(size: size) if let iconURL = feed.blavatarURL { self.imageURL = SiteIconViewModel.optimizedURL(for: iconURL.absoluteString, imageSize: size.size) + } else if let faviconURL { + self.imageURL = faviconURL } } }