Use WKUserScript to inject scripts into the page. Use permalink as base URL.

This commit is contained in:
Brent Simmons
2023-11-25 11:29:56 -08:00
parent 7222dcde6f
commit 279a99259e
7 changed files with 43 additions and 22 deletions

View File

@@ -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)
}

View File

@@ -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))
}

View File

@@ -5,15 +5,6 @@
<style>
[[style]]
</style>
<script src="main.js"></script>
<script src="main_ios.js"></script>
<script src="newsfoot.js" async="async"></script>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
window.scrollTo(0, [[windowScrollY]]);
processPage();
})
</script>
<base href="[[baseURL]]">
</head>
<body>