- 实现EPUB阅读器搜索功能及选中注释功能 - 优化CFI模块,修复代码审查发现的11个问题 - 实现大书远距目录跳转与后台补全优化方案 - 优化设置面板与章节运行时联动 - 重构及大量改进优化
107 lines
3.9 KiB
Swift
107 lines
3.9 KiB
Swift
|
|
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 var isVerboseEnabled: Bool = {
|
|
if let configured = UserDefaults.standard.object(forKey: "RDEPUBWebViewVerboseEnabled") as? Bool {
|
|
return configured
|
|
}
|
|
return false
|
|
}()
|
|
|
|
static var isInspectableEnabled: Bool = {
|
|
if let configured = UserDefaults.standard.object(forKey: "RDEPUBInspectableWebViewsEnabled") as? Bool {
|
|
return configured
|
|
}
|
|
return false
|
|
}()
|
|
|
|
static func applyDebugPolicy(inspectableEnabled: Bool, verboseLoggingEnabled: Bool) {
|
|
isInspectableEnabled = inspectableEnabled
|
|
isVerboseEnabled = verboseLoggingEnabled
|
|
}
|
|
|
|
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 }
|
|
if isVerboseEnabled {
|
|
log(scope, message: "webView=\(webViewID(webView)) message=\(name) body=\(String(describing: body))")
|
|
return
|
|
}
|
|
if let dict = body as? [String: Any] {
|
|
let keys = dict.keys.sorted().joined(separator: ",")
|
|
var meta = "keys=[\(keys)]"
|
|
if let text = dict["text"] as? String {
|
|
meta += " textLen=\(text.count)"
|
|
}
|
|
if let urlString = dict["url"] as? String ?? dict["href"] as? String {
|
|
meta += " url=\(summarizedURL(URL(string: urlString)))"
|
|
}
|
|
log(scope, message: "webView=\(webViewID(webView)) message=\(name) \(meta)")
|
|
} else {
|
|
log(scope, message: "webView=\(webViewID(webView)) message=\(name) type=\(Swift.type(of: 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
|
|
}
|
|
}
|