-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathScriptMessage.swift
70 lines (60 loc) · 1.8 KB
/
ScriptMessage.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
import WebKit
struct ScriptMessage {
let name: Name
let data: [String: Any]
var identifier: String? {
data["identifier"] as? String
}
/// Milliseconds since unix epoch as provided by JavaScript Date.now()
var timestamp: TimeInterval {
data["timestamp"] as? TimeInterval ?? 0
}
var date: Date {
Date(timeIntervalSince1970: timestamp / 1000.0)
}
var restorationIdentifier: String? {
data["restorationIdentifier"] as? String
}
var location: URL? {
guard let locationString = data["location"] as? String else { return nil }
return URL(string: locationString)
}
var options: VisitOptions? {
guard let options = data["options"] as? [String: Any] else { return nil }
return VisitOptions(json: options)
}
}
extension ScriptMessage {
init?(message: WKScriptMessage) {
guard let body = message.body as? [String: Any],
let rawName = body["name"] as? String,
let name = Name(rawValue: rawName),
let data = body["data"] as? [String: Any]
else {
return nil
}
self.init(name: name, data: data)
}
}
extension ScriptMessage {
enum Name: String {
case pageLoaded
case pageLoadFailed
case errorRaised
case visitProposed
case visitProposalScrollingToAnchor
case visitProposalRefreshingPage
case visitStarted
case visitRequestStarted
case visitRequestCompleted
case visitRequestFailed
case visitRequestFailedWithNonHttpStatusCode
case visitRequestFinished
case visitRendered
case visitCompleted
case formSubmissionStarted
case formSubmissionFinished
case pageInvalidated
case log
}
}