RedditWebViewManager.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import AppKit
  2. import WebKit
  3. @MainActor
  4. enum RedditWebViewManager {
  5. private static let processPool = WKProcessPool()
  6. static func makeConfiguration(includeLoginBridge: Bool = true) -> WKWebViewConfiguration {
  7. let configuration = WKWebViewConfiguration()
  8. configuration.processPool = processPool
  9. configuration.websiteDataStore = .default()
  10. configuration.defaultWebpagePreferences.allowsContentJavaScript = true
  11. configuration.preferences.isElementFullscreenEnabled = true
  12. let boundaryScript = WKUserScript(
  13. source: RedditPostBoundaryStyle.injectionScript,
  14. injectionTime: .atDocumentEnd,
  15. forMainFrameOnly: true
  16. )
  17. configuration.userContentController.addUserScript(boundaryScript)
  18. let chromeScript = WKUserScript(
  19. source: RedditHomeChromeStyle.injectionScript,
  20. injectionTime: .atDocumentEnd,
  21. forMainFrameOnly: true
  22. )
  23. configuration.userContentController.addUserScript(chromeScript)
  24. let authChromeScript = WKUserScript(
  25. source: RedditAuthChromeStyle.injectionScript,
  26. injectionTime: .atDocumentEnd,
  27. forMainFrameOnly: true
  28. )
  29. configuration.userContentController.addUserScript(authChromeScript)
  30. if includeLoginBridge {
  31. let loginBridgeScript = WKUserScript(
  32. source: RedditLoginBridgeStyle.injectionScript,
  33. injectionTime: .atDocumentStart,
  34. forMainFrameOnly: true
  35. )
  36. configuration.userContentController.addUserScript(loginBridgeScript)
  37. configuration.userContentController.add(
  38. RedditLoginScriptBridge.shared,
  39. name: RedditLoginBridgeStyle.messageHandlerName
  40. )
  41. }
  42. return configuration
  43. }
  44. static func makeWebView() -> WKWebView {
  45. let webView = WKWebView(frame: .zero, configuration: makeConfiguration())
  46. webView.allowsBackForwardNavigationGestures = true
  47. webView.allowsMagnification = true
  48. webView.customUserAgent = RedditWebAuthHelper.safariUserAgent
  49. applyUnderPageBackground(to: webView, isDarkMode: AppearanceManager.shared.isDarkMode)
  50. return webView
  51. }
  52. static func applyUnderPageBackground(to webView: WKWebView, isDarkMode: Bool) {
  53. webView.underPageBackgroundColor = AppearanceManager.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
  54. }
  55. }