import Foundation import WebKit enum RDEPUBWebViewDebug { static var isEnabled: Bool = { if let configured = UserDefaults.standard.object(forKey: "RDEPUBWebViewDebugEnabled") as? Bool { return configured } #if DEBUG return true #else return false #endif }() static func webViewID(_ webView: WKWebView?) -> String { guard let webView else { return "nil-webview" } return String(ObjectIdentifier(webView).hashValue, radix: 16) } static func log(_ scope: String, message: String) { guard isEnabled else { return } print("[RDReaderWK][\(scope)] \(message)") } static func logNavigationEvent(_ scope: String, webView: WKWebView?, event: String, url: URL? = nil, error: Error? = nil) { guard isEnabled else { return } let webViewToken = webViewID(webView) let urlText = summarizedURL(url) if let error { log(scope, message: "webView=\(webViewToken) event=\(event) url=\(urlText) error=\(error.localizedDescription)") } else { log(scope, message: "webView=\(webViewToken) event=\(event) url=\(urlText)") } } static func logJavaScript(_ scope: String, webView: WKWebView?, action: String, details: String) { guard isEnabled else { return } log(scope, message: "webView=\(webViewID(webView)) js=\(action) \(details)") } static func logMessage(_ scope: String, webView: WKWebView?, name: String, body: Any) { guard isEnabled else { return } log(scope, message: "webView=\(webViewID(webView)) message=\(name) body=\(String(describing: body))") } static func logSchemeTask(_ scope: String, requestURL: URL?, fileURL: URL? = nil, event: String, error: Error? = nil) { guard isEnabled else { return } let requestText = summarizedURL(requestURL) let fileText = summarizedURL(fileURL) if let error { log(scope, message: "scheme=\(event) request=\(requestText) file=\(fileText) error=\(error.localizedDescription)") } else { log(scope, message: "scheme=\(event) request=\(requestText) file=\(fileText)") } } static func summarizedURL(_ url: URL?) -> String { guard let url else { return "nil" } if let scheme = url.scheme, scheme == RDEPUBResourceURLSchemeHandler.scheme { return url.absoluteString } let path = url.path if path.isEmpty { return url.absoluteString } return url.lastPathComponent.isEmpty ? path : url.lastPathComponent } }