| Index: FavIcon/FavIcon.swift |
| diff --git a/FavIcon/FavIcon.swift b/FavIcon/FavIcon.swift |
| index a806ab8bcb1284f795480fd9e64cb8268a70785e..f4355042bf548440c851c7f9ed58f5ea1469fcfc 100644 |
| --- a/FavIcon/FavIcon.swift |
| +++ b/FavIcon/FavIcon.swift |
| @@ -15,6 +15,8 @@ |
| // limitations under the License. |
| // |
| +// swiftlint:disable file_length |
| + |
| import Foundation |
| #if os(iOS) |
| @@ -43,7 +45,8 @@ public enum IconDownloadResult { |
| } |
| /// Responsible for detecting all of the different icons supported by a given site. |
| -@objc public final class FavIcon : NSObject { |
| +@objc |
| +public final class FavIcon: NSObject { |
| // swiftlint:disable function_body_length |
| @@ -65,13 +68,14 @@ public enum IconDownloadResult { |
| /// - parameter url: The base URL to scan. |
| /// - parameter completion: A closure to call when the scan has completed. The closure will be call |
| /// on the main queue. |
| - @objc public static func scan(_ url: URL, completion: @escaping ([DetectedIcon], [String:String]) -> Void) { |
| + @objc |
| + public static func scan(_ url: URL, completion: @escaping ([DetectedIcon], [String: String]) -> Void) { |
| let queue = DispatchQueue(label: "org.bitserf.FavIcon", attributes: []) |
| var icons: [DetectedIcon] = [] |
| var additionalDownloads: [URLRequestWithCallback] = [] |
| let urlSession = urlSessionProvider() |
| - var meta: [String:String] = [:] |
| - |
| + var meta: [String: String] = [:] |
| + |
| let downloadHTMLOperation = DownloadTextOperation(url: url, session: urlSession) |
| let downloadHTML = urlRequestOperation(downloadHTMLOperation) { result in |
| if case let .textDownloaded(actualURL, text, contentType) = result { |
| @@ -87,7 +91,7 @@ public enum IconDownloadResult { |
| for manifestURL in extractWebAppManifestURLs(document, baseURL: url) { |
| let downloadOperation = DownloadTextOperation(url: manifestURL, |
| - session: urlSession) |
| + session: urlSession) |
| let download = urlRequestOperation(downloadOperation) { result in |
| if case .textDownloaded(_, let manifestJSON, _) = result { |
| let jsonIcons = extractManifestJSONIcons( |
| @@ -124,7 +128,6 @@ public enum IconDownloadResult { |
| } |
| } |
| - |
| let favIconURL = URL(string: "/favicon.ico", relativeTo: url as URL)!.absoluteURL |
| let checkFavIconOperation = CheckURLExistsOperation(url: favIconURL, session: urlSession) |
| let checkFavIcon = urlRequestOperation(checkFavIconOperation) { result in |
| @@ -134,7 +137,7 @@ public enum IconDownloadResult { |
| } |
| } |
| } |
| - |
| + |
| let touchIconURL = URL(string: "/apple-touch-icon.png", relativeTo: url as URL)!.absoluteURL |
| let checkTouchIconOperation = CheckURLExistsOperation(url: touchIconURL, session: urlSession) |
| let checkTouchIcon = urlRequestOperation(checkTouchIconOperation) { result in |
| @@ -167,7 +170,8 @@ public enum IconDownloadResult { |
| /// - parameter completion: A closure to call when all download tasks have |
| /// results available (successful or otherwise). The closure |
| /// will be called on the main queue. |
| - @objc public static func download(_ icons: [DetectedIcon], completion: @escaping ([ImageType]) -> Void) { |
| + @objc |
| + public static func download(_ icons: [DetectedIcon], completion: @escaping ([ImageType]) -> Void) { |
| let urlSession = urlSessionProvider() |
| let operations: [DownloadImageOperation] = |
| icons.map { DownloadImageOperation(url: $0.url, session: urlSession) } |
| @@ -176,11 +180,11 @@ public enum IconDownloadResult { |
| let downloadResults: [ImageType] = results.flatMap { result in |
| switch result { |
| case .imageDownloaded(_, let image): |
| - return image; |
| - case .failed(_): |
| - return nil; |
| + return image |
| + case .failed: |
| + return nil |
| default: |
| - return nil; |
| + return nil |
| } |
| } |
| @@ -196,8 +200,9 @@ public enum IconDownloadResult { |
| /// - parameter url: The URL to scan for icons. |
| /// - parameter completion: A closure to call when all download tasks have results available |
| /// (successful or otherwise). The closure will be called on the main queue. |
| - @objc public static func downloadAll(_ url: URL, completion: @escaping ([ImageType]) -> Void) { |
| - scan(url) { icons, meta in |
| + @objc |
| + public static func downloadAll(_ url: URL, completion: @escaping ([ImageType]) -> Void) { |
| + scan(url) { icons, _ in |
| download(icons, completion: completion) |
| } |
| } |
| @@ -213,14 +218,15 @@ public enum IconDownloadResult { |
| /// - parameter completion: A closure to call when the download task has produced results. The closure will |
| /// be called on the main queue. |
| /// - throws: An appropriate `IconError` if downloading was not successful. |
| - @objc public static func downloadPreferred(_ url: URL, |
| + @objc |
| + public static func downloadPreferred(_ url: URL, |
| width: Int, |
| height: Int, |
| completion: @escaping (ImageType?) -> Void) { |
| - scan(url) { icons, meta in |
| + scan(url) { icons, _ in |
| guard let icon = chooseIcon(icons, width: width, height: height) else { |
| DispatchQueue.main.async { |
| - completion(ImageType()); |
| + completion(ImageType()) |
| } |
| return |
| } |
| @@ -232,11 +238,11 @@ public enum IconDownloadResult { |
| let downloadResults: [ImageType] = results.flatMap { result in |
| switch result { |
| case let .imageDownloaded(_, image): |
| - return image; |
| - case .failed(_): |
| - return nil; |
| + return image |
| + case .failed: |
| + return nil |
| default: |
| - return nil; |
| + return nil |
| } |
| } |
| @@ -246,42 +252,45 @@ public enum IconDownloadResult { |
| } |
| } |
| } |
| - |
| - @objc public static func chooseLargestIconSmallerThan(_ icons: [DetectedIcon], width: Int, height: Int) -> DetectedIcon? { |
| - var filteredIcons = icons; |
| - if (width > 0 && height > 0) { |
| - filteredIcons = icons.filter { (icon) -> Bool in |
| + |
| + @objc |
| + public static func chooseLargestIconSmallerThan(_ icons: [DetectedIcon], width: Int, height: Int) -> DetectedIcon? { |
| + var filteredIcons = icons |
| + if width > 0 && height > 0 { |
| + filteredIcons = icons.filter { icon -> Bool in |
| if let iconWidth = icon.width, |
| let iconHeight = icon.height { |
| - return iconWidth <= width && iconHeight <= height; |
| + return iconWidth <= width && iconHeight <= height |
| } else { return true; } |
| } |
| } |
| - return chooseIcon(filteredIcons, width: 0, height: 0); |
| + return chooseIcon(filteredIcons, width: 0, height: 0) |
| } |
| - |
| - @objc public static func choseIconLargerThan(_ icons: [DetectedIcon], width: Int, height: Int) -> DetectedIcon? { |
| - var filteredIcons = icons; |
| - if (width > 0 && height > 0) { |
| - filteredIcons = icons.filter { (icon) -> Bool in |
| + |
| + @objc |
| + public static func choseIconLargerThan(_ icons: [DetectedIcon], width: Int, height: Int) -> DetectedIcon? { |
| + var filteredIcons = icons |
| + if width > 0 && height > 0 { |
| + filteredIcons = icons.filter { icon -> Bool in |
| if let iconWidth = icon.width, |
| let iconHeight = icon.height { |
| - return iconWidth >= width && iconHeight >= height; |
| + return iconWidth >= width && iconHeight >= height |
| } else { return true; } |
| } |
| } |
| - return chooseIcon(filteredIcons, width: 0, height: 0); |
| - |
| + return chooseIcon(filteredIcons, width: 0, height: 0) |
| } |
| // MARK: Test hooks |
| typealias URLSessionProvider = () -> URLSession |
| + |
| @objc static var urlSessionProvider: URLSessionProvider = FavIcon.createDefaultURLSession |
| // MARK: Internal |
| - @objc static func createDefaultURLSession() -> URLSession { |
| + @objc |
| + static func createDefaultURLSession() -> URLSession { |
| return URLSession.shared |
| } |
| @@ -295,12 +304,12 @@ public enum IconDownloadResult { |
| /// - returns: The chosen icon, or `nil`, if `icons` is empty. |
| static func chooseIcon(_ icons: [DetectedIcon], width: Int? = nil, height: Int? = nil) -> DetectedIcon? { |
| guard icons.count > 0 else { return nil } |
| - |
| + |
| let iconsInPreferredOrder = icons.sorted { left, right in |
| - if width! > 0 || height! > 0 { |
| + if width! > 0 || height! > 0 { |
| let preferredWidth = width, preferredHeight = height, |
| widthLeft = left.width, heightLeft = left.height, |
| - widthRight = right.width, heightRight = right.height; |
| + widthRight = right.width, heightRight = right.height |
| // Which is closest to preferred size? |
| let deltaA = abs(widthLeft! - preferredWidth!) * abs(heightLeft! - preferredHeight!) |
| let deltaB = abs(widthRight! - preferredWidth!) * abs(heightRight! - preferredHeight!) |
| @@ -328,7 +337,7 @@ public enum IconDownloadResult { |
| return iconsInPreferredOrder.first! |
| } |
| - fileprivate override init () { |
| + private override init () { |
| } |
| } |
| @@ -352,7 +361,8 @@ extension FavIcon { |
| /// - parameter completion: A closure to call when the scan has completed. The closure will be called |
| /// on the main queue. |
| /// - throws: An `IconError` if the scan failed for some reason. |
| - @objc public static func scan(_ url: String, completion: @escaping ([DetectedIcon], [String:String]) -> Void) throws { |
| + @objc |
| + public static func scan(_ url: String, completion: @escaping ([DetectedIcon], [String: String]) -> Void) throws { |
| guard let url = URL(string: url) else { throw IconError.invalidBaseURL } |
| scan(url, completion: completion) |
| } |
| @@ -364,7 +374,8 @@ extension FavIcon { |
| /// - parameter completion: A closure to call when all download tasks have results available |
| /// (successful or otherwise). The closure will be called on the main queue. |
| /// - throws: An `IconError` if the scan or download failed for some reason. |
| - @objc public static func downloadAll(_ url: String, completion: @escaping ([ImageType]) -> Void) throws { |
| + @objc |
| + public static func downloadAll(_ url: String, completion: @escaping ([ImageType]) -> Void) throws { |
| guard let url = URL(string: url) else { throw IconError.invalidBaseURL } |
| downloadAll(url, completion: completion) |
| } |
| @@ -378,7 +389,8 @@ extension FavIcon { |
| /// - parameter completion: A closure to call when the download task has produced a result. The closure will |
| /// be called on the main queue. |
| /// - throws: An appropriate `IconError` if downloading failed for some reason. |
| - @objc public static func downloadPreferred(_ url: String, |
| + @objc |
| + public static func downloadPreferred(_ url: String, |
| width: Int, |
| height: Int, |
| completion: @escaping (ImageType?) -> Void) throws { |
| @@ -396,5 +408,3 @@ extension DetectedIcon { |
| return nil |
| } |
| } |
| - |
| - |