Use WKUserScript to inject scripts into the page. Use permalink as base URL.
This commit is contained in:
parent
7222dcde6f
commit
279a99259e
|
@ -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) {
|
||||
|
|
|
@ -4,14 +4,6 @@
|
|||
<style>
|
||||
[[style]]
|
||||
</style>
|
||||
<script src="main.js"></script>
|
||||
<script src="main_mac.js"></script>
|
||||
<script src="newsfoot.js" async="async"></script>
|
||||
<script type="text/javascript">
|
||||
document.addEventListener("DOMContentLoaded", function(event) {
|
||||
processPage();
|
||||
})
|
||||
</script>
|
||||
<base href="[[baseURL]]">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -168,3 +168,8 @@ function processPage() {
|
|||
removeWpSmiley()
|
||||
postRenderProcessing();
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function(event) {
|
||||
window.scrollTo(0, [[windowScrollY]]);
|
||||
processPage();
|
||||
})
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue