-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathJavaScriptVisit.swift
93 lines (73 loc) · 3.75 KB
/
JavaScriptVisit.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import Foundation
/// A `JavaScript` managed visit through the Hotwire library.
/// All visits are `JavaScriptVisits` except the initial `ColdBootVisit`
/// or if a `reload()` is issued.
final class JavaScriptVisit: Visit {
var identifier = "(pending)"
init(visitable: Visitable, options: VisitOptions, bridge: WebViewBridge, restorationIdentifier: String?) {
super.init(visitable: visitable, options: options, bridge: bridge)
self.restorationIdentifier = restorationIdentifier
}
override var debugDescription: String {
"<JavaScriptVisit identifier: \(identifier), state: \(state), location: \(location)>"
}
override func startVisit() {
log("startVisit")
bridge.visitDelegate = self
bridge.visitLocation(location, options: options, restorationIdentifier: restorationIdentifier)
}
override func cancelVisit() {
log("cancelVisit")
bridge.cancelVisit(withIdentifier: identifier)
finishRequest()
}
override func failVisit() {
log("failVisit")
finishRequest()
}
}
extension JavaScriptVisit: WebViewVisitDelegate {
func webView(_ webView: WebViewBridge, didStartVisitWithIdentifier identifier: String, hasCachedSnapshot: Bool, isPageRefresh: Bool) {
log("didStartVisitWithIdentifier", ["identifier": identifier, "hasCachedSnapshot": hasCachedSnapshot, "isPageRefresh": isPageRefresh])
self.identifier = identifier
self.hasCachedSnapshot = hasCachedSnapshot
self.isPageRefresh = isPageRefresh
delegate?.visitDidStart(self)
}
func webView(_ webView: WebViewBridge, didStartRequestForVisitWithIdentifier identifier: String, date: Date) {
guard identifier == self.identifier else { return }
log("didStartRequestForVisitWithIdentifier", ["identifier": identifier, "date": date])
startRequest()
}
func webView(_ webView: WebViewBridge, didCompleteRequestForVisitWithIdentifier identifier: String) {
guard identifier == self.identifier else { return }
log("didCompleteRequestForVisitWithIdentifier", ["identifier": identifier])
if hasCachedSnapshot {
delegate?.visitWillLoadResponse(self)
}
}
func webView(_ webView: WebViewBridge, didFailRequestForVisitWithIdentifier identifier: String, statusCode: Int) {
guard identifier == self.identifier else { return }
log("didFailRequestForVisitWithIdentifier", ["identifier": identifier, "statusCode": statusCode])
fail(with: TurboError(statusCode: statusCode))
}
func webView(_ webView: WebViewBridge, didFinishRequestForVisitWithIdentifier identifier: String, date: Date) {
guard identifier == self.identifier else { return }
log("didFinishRequestForVisitWithIdentifier", ["identifier": identifier, "date": date])
finishRequest()
}
func webView(_ webView: WebViewBridge, didRenderForVisitWithIdentifier identifier: String) {
guard identifier == self.identifier else { return }
log("didRenderForVisitWithIdentifier", ["identifier": identifier])
delegate?.visitDidRender(self)
}
func webView(_ webView: WebViewBridge, didCompleteVisitWithIdentifier identifier: String, restorationIdentifier: String) {
guard identifier == self.identifier else { return }
log("didCompleteVisitWithIdentifier", ["identifier": identifier, "restorationIdentifier": restorationIdentifier])
self.restorationIdentifier = restorationIdentifier
complete()
}
private func log(_ name: String, _ arguments: [String: Any] = [:]) {
logger.debug("[JavascriptVisit] \(name) \(self.location.absoluteString), \(arguments)")
}
}