diff --git a/Mac/MainWindow/Detail/DetailWebViewController.swift b/Mac/MainWindow/Detail/DetailWebViewController.swift index e7ca8045d..546b4e337 100644 --- a/Mac/MainWindow/Detail/DetailWebViewController.swift +++ b/Mac/MainWindow/Detail/DetailWebViewController.swift @@ -73,6 +73,17 @@ final class DetailWebViewController: NSViewController { } } + static let userScripts: [WKUserScript] = { + let appScriptsWorld = WKContentWorld.world(name: "NetNewsWire") + let filenames = ["main", "main_mac", "newsfoot"] + let scripts = filenames.map { filename in + let scriptURL = Bundle.main.url(forResource: filename, withExtension: ".js")! + let scriptSource = try! String(contentsOf: scriptURL) + return WKUserScript(source: scriptSource, injectionTime: .atDocumentStart, forMainFrameOnly: true, in: appScriptsWorld) + } + return scripts + }() + private struct MessageName { static let mouseDidEnter = "mouseDidEnter" static let mouseDidExit = "mouseDidExit" @@ -83,18 +94,23 @@ final class DetailWebViewController: NSViewController { let preferences = WKPreferences() preferences.minimumFontSize = 12.0 preferences.javaScriptCanOpenWindowsAutomatically = false - preferences.javaScriptEnabled = true + let configuration = WKWebViewConfiguration() configuration.preferences = preferences + configuration.defaultWebpagePreferences.allowsContentJavaScript = false configuration.setURLSchemeHandler(detailIconSchemeHandler, forURLScheme: ArticleRenderer.imageIconScheme) let userContentController = WKUserContentController() userContentController.add(self, name: MessageName.windowDidScroll) userContentController.add(self, name: MessageName.mouseDidEnter) userContentController.add(self, name: MessageName.mouseDidExit) + for script in Self.userScripts { + userContentController.addUserScript(script) + } configuration.userContentController = userContentController + webView = DetailWebView(frame: NSRect.zero, configuration: configuration) webView.uiDelegate = self webView.navigationDelegate = self @@ -327,7 +343,7 @@ private extension DetailWebViewController { ] let html = try! MacroProcessor.renderedText(withTemplate: ArticleRenderer.page.html, substitutions: substitutions) - webView.loadHTMLString(html, baseURL: ArticleRenderer.page.baseURL) + webView.loadHTMLString(html, baseURL: URL(string: rendering.baseURL)) } func fetchScrollInfo(_ completion: @escaping (ScrollInfo?) -> Void) { diff --git a/Mac/MainWindow/Detail/page.html b/Mac/MainWindow/Detail/page.html index ceaa13f7f..3d71f2c98 100644 --- a/Mac/MainWindow/Detail/page.html +++ b/Mac/MainWindow/Detail/page.html @@ -4,14 +4,6 @@ - - - - diff --git a/Shared/Article Rendering/main.js b/Shared/Article Rendering/main.js index 13f90b638..1cf76b59c 100644 --- a/Shared/Article Rendering/main.js +++ b/Shared/Article Rendering/main.js @@ -168,3 +168,8 @@ function processPage() { removeWpSmiley() postRenderProcessing(); } + +document.addEventListener("DOMContentLoaded", function(event) { + window.scrollTo(0, [[windowScrollY]]); + processPage(); +}) diff --git a/iOS/Article/PreloadedWebView.swift b/iOS/Article/PreloadedWebView.swift index 3bf76a2ca..32eec3fe5 100644 --- a/iOS/Article/PreloadedWebView.swift +++ b/iOS/Article/PreloadedWebView.swift @@ -13,7 +13,17 @@ class PreloadedWebView: WKWebView { private var isReady: Bool = false private var readyCompletion: (() -> Void)? - + + static let userScripts: [WKUserScript] = { + var scripts = [WKUserScript]() + for fileName in ["main.js", "main_ios.js", "newsfoot.js"] { + let scriptSource = try! String(contentsOf: baseURL.appending(path: fileName, directoryHint: .notDirectory)) + let script = WKUserScript(source: scriptSource, injectionTime: .atDocumentStart, forMainFrameOnly: true, in: appScriptsWorld) + scripts.append(script) + } + return scripts + }() + init(articleIconSchemeHandler: ArticleIconSchemeHandler) { let preferences = WKPreferences() preferences.javaScriptCanOpenWindowsAutomatically = false @@ -26,6 +36,13 @@ class PreloadedWebView: WKWebView { configuration.mediaTypesRequiringUserActionForPlayback = .audio configuration.setURLSchemeHandler(articleIconSchemeHandler, forURLScheme: ArticleRenderer.imageIconScheme) + let userContentController = WKUserContentController() + let appScriptsWorld = WKContentWorld.world(name: "NetNewsWire") + for script in Self.userScripts { + userContentController.addUserScript(script) + } + configuration.userContentController = userContentController + super.init(frame: .zero, configuration: configuration) } diff --git a/iOS/Article/WebViewController.swift b/iOS/Article/WebViewController.swift index 38b83c1b2..e48dd3471 100644 --- a/iOS/Article/WebViewController.swift +++ b/iOS/Article/WebViewController.swift @@ -594,7 +594,7 @@ private extension WebViewController { ] let html = try! MacroProcessor.renderedText(withTemplate: ArticleRenderer.page.html, substitutions: substitutions) - webView.loadHTMLString(html, baseURL: ArticleRenderer.page.baseURL) + webView.loadHTMLString(html, baseURL: URL(string: rendering.baseURL)) } diff --git a/iOS/Resources/page.html b/iOS/Resources/page.html index 686c4612d..b6513009a 100644 --- a/iOS/Resources/page.html +++ b/iOS/Resources/page.html @@ -5,15 +5,6 @@ - - - - diff --git a/xcconfig/common/NetNewsWire_mac_target_common.xcconfig b/xcconfig/common/NetNewsWire_mac_target_common.xcconfig index b1128ae28..2f25d4d88 100644 --- a/xcconfig/common/NetNewsWire_mac_target_common.xcconfig +++ b/xcconfig/common/NetNewsWire_mac_target_common.xcconfig @@ -6,5 +6,5 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon COMBINE_HIDPI_IMAGES = YES -MACOSX_DEPLOYMENT_TARGET = 10.15 +MACOSX_DEPLOYMENT_TARGET = 11.0 SDKROOT = macosx;