1
1
package org.hildan.chrome.devtools.protocol.preprocessing
2
2
3
3
import org.hildan.chrome.devtools.protocol.json.JsonDomain
4
+ import org.hildan.chrome.devtools.protocol.json.JsonDomainCommand
4
5
import org.hildan.chrome.devtools.protocol.json.JsonDomainParameter
5
6
import org.hildan.chrome.devtools.protocol.json.JsonDomainType
6
7
7
8
/* *
8
9
* Pre-processes the list of domains from the JSON definitions to work around some issues in the definitions themselves.
9
10
*/
10
11
internal fun List<JsonDomain>.preprocessed (): List <JsonDomain > = this
12
+ .makeNewExperimentalPropsOptional()
11
13
// Workaround for https://github.com/ChromeDevTools/devtools-protocol/issues/317
12
14
.transformDomainTypeProperty(" Network" , " Cookie" , " expires" ) { it.copy(optional = true ) }
13
15
// Workaround for https://github.com/ChromeDevTools/devtools-protocol/issues/244
14
16
.map { it.pullNestedEnumsToTopLevel() }
15
17
18
+ /* *
19
+ * Modifies some new experimental properties to make them optional, so that serialization doesn't fail on stable Chrome
20
+ * versions.
21
+ *
22
+ * When new properties are added to experimental types in the most recent protocol versions, the stable Chrome doesn't
23
+ * have them yet, and serialization fails because of these missing properties. This also affects tests which are using
24
+ * Docker containers with the latest-ish stable Chrome version.
25
+ */
26
+ // NOTE: only add properties that are not already in the latest stable. We don't want to make everything nullable.
27
+ private fun List<JsonDomain>.makeNewExperimentalPropsOptional (): List <JsonDomain > =
28
+ transformDomainCommandReturnProp(" Runtime" , " getHeapUsage" , " embedderHeapUsedSize" ) { it.copy(optional = true ) }
29
+ .transformDomainCommandReturnProp(" Runtime" , " getHeapUsage" , " backingStorageSize" ) { it.copy(optional = true ) }
30
+
16
31
private fun List<JsonDomain>.transformDomainTypeProperty (
17
32
domain : String ,
18
33
type : String ,
@@ -24,6 +39,17 @@ private fun List<JsonDomain>.transformDomainTypeProperty(
24
39
}
25
40
}
26
41
42
+ private fun List<JsonDomain>.transformDomainCommandReturnProp (
43
+ domain : String ,
44
+ command : String ,
45
+ property : String ,
46
+ transform : (JsonDomainParameter ) -> JsonDomainParameter ,
47
+ ): List <JsonDomain > = transformDomain(domain) { d ->
48
+ d.transformCommand(command) { t ->
49
+ t.transformReturnProperty(property, transform)
50
+ }
51
+ }
52
+
27
53
private fun List<JsonDomain>.transformDomain (
28
54
name : String ,
29
55
transform : (JsonDomain ) -> JsonDomain ,
@@ -39,5 +65,15 @@ private fun JsonDomainType.transformProperty(
39
65
transform : (JsonDomainParameter ) -> JsonDomainParameter ,
40
66
): JsonDomainType = copy(properties = properties.transformIf({ it.name == name }) { transform(it) })
41
67
68
+ private fun JsonDomain.transformCommand (
69
+ name : String ,
70
+ transform : (JsonDomainCommand ) -> JsonDomainCommand ,
71
+ ): JsonDomain = copy(commands = commands.transformIf({ it.name == name }) { transform(it) })
72
+
73
+ private fun JsonDomainCommand.transformReturnProperty (
74
+ name : String ,
75
+ transform : (JsonDomainParameter ) -> JsonDomainParameter ,
76
+ ): JsonDomainCommand = copy(returns = returns.transformIf({ it.name == name }) { transform(it) })
77
+
42
78
private fun <T > List<T>.transformIf (predicate : (T ) -> Boolean , transform : (T ) -> T ): List <T > =
43
79
map { if (predicate(it)) transform(it) else it }
0 commit comments