diff --git a/Mac/AppDelegate.swift b/Mac/AppDelegate.swift index eab8e5bfe..91d6e87ee 100644 --- a/Mac/AppDelegate.swift +++ b/Mac/AppDelegate.swift @@ -986,8 +986,8 @@ extension AppDelegate: NSWindowRestoration { if identifier.rawValue == WindowRestorationIdentifiers.mainWindow { mainWindow = appDelegate.createAndShowMainWindow().window } - return mainWindow - } + return mainWindow! + } } // Handle Notification Actions diff --git a/Mac/MainWindow/Detail/DetailViewController.swift b/Mac/MainWindow/Detail/DetailViewController.swift index 0c5758b54..33d94a7d6 100644 --- a/Mac/MainWindow/Detail/DetailViewController.swift +++ b/Mac/MainWindow/Detail/DetailViewController.swift @@ -83,12 +83,12 @@ final class DetailViewController: NSViewController, WKUIDelegate { 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 559fa76e2..6ea10a40c 100644 --- a/Mac/MainWindow/Detail/DetailWebViewController.swift +++ b/Mac/MainWindow/Detail/DetailWebViewController.swift @@ -166,14 +166,21 @@ final class DetailWebViewController: NSViewController { } @objc func userDefaultsDidChange(_ note: Notification) { + if articleTextSize != AppDefaults.shared.articleTextSize { articleTextSize = AppDefaults.shared.articleTextSize - reloadHTMLMaintainingScrollPosition() + + Task { @MainActor in + await reloadHTMLMaintainingScrollPosition() + } } } - + @objc func currentArticleThemeDidChangeNotification(_ note: Notification) { - reloadHTMLMaintainingScrollPosition() + + Task { @MainActor in + await reloadHTMLMaintainingScrollPosition() + } } // MARK: Media Functions @@ -184,16 +191,14 @@ final class DetailWebViewController: NSViewController { // MARK: Scrolling - func canScrollDown(_ completion: @escaping (Bool) -> Void) { - fetchScrollInfo { (scrollInfo) in - completion(scrollInfo?.canScrollDown ?? false) - } + func canScrollDown() async -> Bool { + let scrollInfo = await fetchScrollInfo() + return scrollInfo?.canScrollDown ?? false } - func canScrollUp(_ completion: @escaping (Bool) -> Void) { - fetchScrollInfo { (scrollInfo) in - completion(scrollInfo?.canScrollUp ?? false) - } + func canScrollUp() async -> Bool { + let scrollInfo = await fetchScrollInfo() + return scrollInfo?.canScrollUp ?? false } override func scrollPageDown(_ sender: Any?) { @@ -326,11 +331,10 @@ private extension DetailWebViewController { } } - func reloadHTMLMaintainingScrollPosition() { - fetchScrollInfo() { scrollInfo in - self.windowScrollY = scrollInfo?.offsetY - self.reloadHTML() - } + func reloadHTMLMaintainingScrollPosition() async { + let scrollInfo = await fetchScrollInfo() + windowScrollY = scrollInfo?.offsetY + self.reloadHTML() } func reloadHTML() { @@ -380,23 +384,22 @@ private extension DetailWebViewController { webView.loadHTMLString(html, baseURL: baseURL) } - func fetchScrollInfo(_ completion: @escaping (ScrollInfo?) -> Void) { - + func fetchScrollInfo() 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 - } - - let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY) - completion(scrollInfo) + guard let info = try? await webView.evaluateJavaScript(javascriptString) else { + return nil } + guard let info = info as? [String: Any] else { + return nil + } + guard let contentHeight = info["contentHeight"] as? CGFloat, let offsetY = info["offsetY"] as? CGFloat else { + return nil + } + + let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY) + return scrollInfo } #if !MAC_APP_STORE diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 57199216f..09551a2b0 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -288,26 +288,36 @@ final class MainWindowController : NSWindowController, NSUserInterfaceValidation // MARK: - Actions @IBAction func scrollOrGoToNextUnread(_ sender: Any?) { - guard let detailViewController = detailViewController else { + + guard let 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 { + self.nextUnread(sender) + } } } @IBAction func scrollUp(_ sender: Any?) { - guard let detailViewController = detailViewController else { + + guard let 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?) {