From 0402bd607f27c102a37876e38bbcd9d3cbe222a8 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Mon, 10 Jul 2023 21:19:28 -0700 Subject: [PATCH] Continue adopting async/await. --- .../Detail/DetailViewController.swift | 10 ++--- .../Detail/DetailWebViewController.swift | 43 ++++++++++--------- Mac/MainWindow/MainWindowController.swift | 17 +++++--- 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/Mac/MainWindow/Detail/DetailViewController.swift b/Mac/MainWindow/Detail/DetailViewController.swift index e4b099bf4..fb1aa1917 100644 --- a/Mac/MainWindow/Detail/DetailViewController.swift +++ b/Mac/MainWindow/Detail/DetailViewController.swift @@ -63,13 +63,13 @@ enum DetailState: Equatable { func stopMediaPlayback() { currentWebViewController.stopMediaPlayback() } - - func canScrollDown(_ callback: @escaping (Bool) -> Void) { - currentWebViewController.canScrollDown(callback) + + func canScrollDown() async -> Bool { + await currentWebViewController.canScrollDown() } - func canScrollUp(_ callback: @escaping (Bool) -> Void) { - currentWebViewController.canScrollUp(callback) + func canScrollUp() async -> Bool { + await currentWebViewController.canScrollUp() } override func scrollPageDown(_ sender: Any?) { diff --git a/Mac/MainWindow/Detail/DetailWebViewController.swift b/Mac/MainWindow/Detail/DetailWebViewController.swift index 07f50a461..c365727c6 100644 --- a/Mac/MainWindow/Detail/DetailWebViewController.swift +++ b/Mac/MainWindow/Detail/DetailWebViewController.swift @@ -161,16 +161,14 @@ protocol DetailWebViewControllerDelegate: AnyObject { // MARK: Scrolling - func canScrollDown(_ completion: @escaping (Bool) -> Void) { - fetchScrollInfo { (scrollInfo) in - completion(scrollInfo?.canScrollDown ?? false) - } + func canScrollDown() async -> Bool { + let scrollInfo = await scrollInfo() + return scrollInfo?.canScrollDown ?? false } - func canScrollUp(_ completion: @escaping (Bool) -> Void) { - fetchScrollInfo { (scrollInfo) in - completion(scrollInfo?.canScrollUp ?? false) - } + func canScrollUp() async -> Bool { + let scrollInfo = await scrollInfo() + return scrollInfo?.canScrollUp ?? false } override func scrollPageDown(_ sender: Any?) { @@ -292,7 +290,8 @@ private extension DetailWebViewController { } func reloadHTMLMaintainingScrollPosition() { - fetchScrollInfo() { scrollInfo in + Task { @MainActor in + let scrollInfo = await scrollInfo() self.windowScrollY = scrollInfo?.offsetY self.reloadHTML() } @@ -330,21 +329,23 @@ private extension DetailWebViewController { webView.loadHTMLString(html, baseURL: ArticleRenderer.page.baseURL) } - func fetchScrollInfo(_ completion: @escaping (ScrollInfo?) -> Void) { + func scrollInfo() async -> ScrollInfo? { let javascriptString = "var x = {contentHeight: document.body.scrollHeight, offsetY: window.pageYOffset}; x" - webView.evaluateJavaScript(javascriptString) { (info, error) in - guard let info = info as? [String: Any] else { - completion(nil) - return - } - guard let contentHeight = info["contentHeight"] as? CGFloat, let offsetY = info["offsetY"] as? CGFloat else { - completion(nil) - return - } + return await withCheckedContinuation { continuation in + webView.evaluateJavaScript(javascriptString) { (info, error) in + guard let info = info as? [String: Any] else { + continuation.resume(returning: nil) + return + } + guard let contentHeight = info["contentHeight"] as? CGFloat, let offsetY = info["offsetY"] as? CGFloat else { + continuation.resume(returning: nil) + return + } - let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY) - completion(scrollInfo) + let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY) + continuation.resume(returning: scrollInfo) + } } } diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 23478446a..32d57548a 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -310,9 +310,15 @@ enum TimelineSourceMode { guard let detailViewController = detailViewController else { return } - detailViewController.canScrollDown { (canScroll) in + + Task { @MainActor in + let canScroll = await detailViewController.canScrollDown() NSCursor.setHiddenUntilMouseMoves(true) - canScroll ? detailViewController.scrollPageDown(sender) : self.nextUnread(sender) + if canScroll { + detailViewController.scrollPageDown(sender) + } else { + nextUnread(sender) + } } } @@ -320,13 +326,14 @@ enum TimelineSourceMode { guard let detailViewController = detailViewController else { return } - detailViewController.canScrollUp { (canScroll) in - if (canScroll) { + + Task { @MainActor in + let canScroll = await detailViewController.canScrollUp() + if canScroll { NSCursor.setHiddenUntilMouseMoves(true) detailViewController.scrollPageUp(sender) } } - } @IBAction func copyArticleURL(_ sender: Any?) {