| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import AppKit
- import WebKit
- @MainActor
- enum RedditWebViewManager {
- private static let processPool = WKProcessPool()
- static func makeConfiguration(includeLoginBridge: Bool = true) -> WKWebViewConfiguration {
- let configuration = WKWebViewConfiguration()
- configuration.processPool = processPool
- configuration.websiteDataStore = .default()
- configuration.defaultWebpagePreferences.allowsContentJavaScript = true
- configuration.preferences.isElementFullscreenEnabled = true
- let isDarkMode = AppearanceManager.shared.isDarkMode
- let themeScript = WKUserScript(
- source: RedditThemeStyle.earlyInjectionScript(isDarkMode: isDarkMode),
- injectionTime: .atDocumentStart,
- forMainFrameOnly: true
- )
- configuration.userContentController.addUserScript(themeScript)
- let boundaryScript = WKUserScript(
- source: RedditPostBoundaryStyle.injectionScript,
- injectionTime: .atDocumentEnd,
- forMainFrameOnly: true
- )
- configuration.userContentController.addUserScript(boundaryScript)
- let chromeScript = WKUserScript(
- source: RedditHomeChromeStyle.injectionScript,
- injectionTime: .atDocumentEnd,
- forMainFrameOnly: true
- )
- configuration.userContentController.addUserScript(chromeScript)
- let authChromeScript = WKUserScript(
- source: RedditAuthChromeStyle.injectionScript,
- injectionTime: .atDocumentStart,
- forMainFrameOnly: false
- )
- configuration.userContentController.addUserScript(authChromeScript)
- if includeLoginBridge {
- let loginBridgeScript = WKUserScript(
- source: RedditLoginBridgeStyle.injectionScript,
- injectionTime: .atDocumentStart,
- forMainFrameOnly: true
- )
- configuration.userContentController.addUserScript(loginBridgeScript)
- configuration.userContentController.add(
- RedditLoginScriptBridge.shared,
- name: RedditLoginBridgeStyle.messageHandlerName
- )
- }
- return configuration
- }
- static func makeWebView() -> WKWebView {
- let webView = WKWebView(frame: .zero, configuration: makeConfiguration())
- webView.allowsBackForwardNavigationGestures = true
- webView.allowsMagnification = true
- webView.customUserAgent = RedditWebAuthHelper.safariUserAgent
- let isDarkMode = AppearanceManager.shared.isDarkMode
- applyTheme(to: webView, isDarkMode: isDarkMode)
- return webView
- }
- static func applyTheme(to webView: WKWebView, isDarkMode: Bool) {
- applyAppearance(to: webView, isDarkMode: isDarkMode)
- applyUnderPageBackground(to: webView, isDarkMode: isDarkMode)
- webView.evaluateJavaScript(
- RedditThemeStyle.syncScript(isDarkMode: isDarkMode),
- completionHandler: nil
- )
- }
- static func applyAppearance(to webView: WKWebView, isDarkMode: Bool) {
- let appearanceName: NSAppearance.Name = isDarkMode ? .darkAqua : .aqua
- webView.appearance = NSAppearance(named: appearanceName)
- }
- static func applyUnderPageBackground(to webView: WKWebView, isDarkMode: Bool) {
- webView.underPageBackgroundColor = AppearanceManager.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
- }
- }
|