cfsolve 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/README.md +10 -9
  4. data/UPSTREAM.md +6 -6
  5. data/lib/cfsolve/profiles/safari-26-ios/answers.json +2562 -1887
  6. data/lib/cfsolve/profiles/safari-26-ios/challenge-page-answers.json +1873 -1198
  7. data/lib/cfsolve/profiles/safari-26-ios.json +0 -8
  8. data/lib/cfsolve/version.rb +2 -2
  9. data/vendor/cfsolve/README.md +0 -35
  10. data/vendor/cfsolve/examples/build_profile.rs +17 -15
  11. data/vendor/cfsolve/examples/capture_session.rs +37 -0
  12. data/vendor/cfsolve/examples/check_answers.rs +66 -0
  13. data/vendor/cfsolve/examples/compare_session.rs +190 -0
  14. data/vendor/cfsolve/examples/stage2_snapshot.rs +4 -1
  15. data/vendor/cfsolve/profiles/safari-26-ios/answers.json +2562 -1887
  16. data/vendor/cfsolve/profiles/safari-26-ios/challenge-page-answers.json +1873 -1198
  17. data/vendor/cfsolve/profiles/safari-26-ios.json +0 -8
  18. data/vendor/cfsolve/scripts/capture_cssom.mjs +42 -0
  19. data/vendor/cfsolve/scripts/serve_cssom.py +111 -0
  20. data/vendor/cfsolve/src/capture/profile.rs +7 -18
  21. data/vendor/cfsolve/src/capture/recorded.rs +42 -7
  22. data/vendor/cfsolve/src/challenge/installed/audit.rs +131 -0
  23. data/vendor/cfsolve/src/challenge/installed.rs +122 -271
  24. data/vendor/cfsolve/src/challenge/payload.rs +107 -5
  25. data/vendor/cfsolve/src/challenge/state.rs +98 -16
  26. data/vendor/cfsolve/src/deobfuscate/encoded_strings.rs +3 -2
  27. data/vendor/cfsolve/src/deobfuscate/helper_objects.rs +17 -32
  28. data/vendor/cfsolve/src/deobfuscate/register_arrays.rs +18 -5
  29. data/vendor/cfsolve/src/embedding_page/extra_params.rs +0 -14
  30. data/vendor/cfsolve/src/embedding_page/page.rs +28 -2
  31. data/vendor/cfsolve/src/http/client.rs +11 -0
  32. data/vendor/cfsolve/src/js/ast.rs +12 -3
  33. data/vendor/cfsolve/src/js/objects.rs +9 -2
  34. data/vendor/cfsolve/src/listing/fold.rs +0 -83
  35. data/vendor/cfsolve/src/listing/query.rs +25 -244
  36. data/vendor/cfsolve/src/listing.rs +0 -1
  37. data/vendor/cfsolve/src/session/initial.rs +14 -5
  38. data/vendor/cfsolve/src/session/probes.rs +160 -125
  39. data/vendor/cfsolve/src/session/timing.rs +58 -53
  40. data/vendor/cfsolve/src/session/widget.rs +5 -6
  41. data/vendor/cfsolve/src/stage2/analysis/analyze.rs +50 -33
  42. data/vendor/cfsolve/src/stage2/analysis/discovery.rs +61 -66
  43. data/vendor/cfsolve/src/stage2/analysis/envelope.rs +31 -21
  44. data/vendor/cfsolve/src/stage2/analysis/recognize.rs +3 -5
  45. data/vendor/cfsolve/src/stage2/analysis.rs +0 -1
  46. data/vendor/cfsolve/src/stage2/audit_globals.rs +310 -0
  47. data/vendor/cfsolve/src/stage2/benchmark.rs +5 -8
  48. data/vendor/cfsolve/src/stage2/call_stack.rs +72 -16
  49. data/vendor/cfsolve/src/stage2/interaction/native.rs +2 -1
  50. data/vendor/cfsolve/src/stage2/interaction/plan.rs +0 -3
  51. data/vendor/cfsolve/src/stage2/payload/recover.rs +54 -23
  52. data/vendor/cfsolve/src/stage2/probes/ice.rs +11 -10
  53. data/vendor/cfsolve/src/stage2/probes/media.rs +47 -33
  54. data/vendor/cfsolve/src/stage2/probes/performance.rs +1 -0
  55. data/vendor/cfsolve/src/stage2/probes/rects.rs +12 -17
  56. data/vendor/cfsolve/src/stage2/probes/stack.rs +50 -103
  57. data/vendor/cfsolve/src/stage2/probes/websocket_echo.rs +17 -86
  58. data/vendor/cfsolve/src/stage2/probes.rs +0 -1
  59. data/vendor/cfsolve/src/stage2/records.rs +4 -13
  60. data/vendor/cfsolve/src/stage2/reference.json +1 -1
  61. data/vendor/cfsolve/src/stage2/reference.rs +98 -100
  62. data/vendor/cfsolve/src/stage2/registry.rs +41 -34
  63. data/vendor/cfsolve/src/stage2/replay.rs +182 -254
  64. data/vendor/cfsolve/src/stage2/stylesheets.rs +176 -0
  65. data/vendor/cfsolve/src/stage2/trace.rs +18 -0
  66. data/vendor/cfsolve/src/stage2/vocabulary.rs +111 -401
  67. data/vendor/cfsolve/src/stage2.rs +2 -1
  68. data/vendor/cfsolve/src/vm/disassemble.rs +39 -10
  69. data/vendor/cfsolve/src/vm/interpret/access.rs +5 -21
  70. data/vendor/cfsolve/src/vm/interpret/builtin.rs +6 -53
  71. data/vendor/cfsolve/src/vm/interpret/call.rs +86 -9
  72. data/vendor/cfsolve/src/vm/interpret/compile.rs +626 -0
  73. data/vendor/cfsolve/src/vm/interpret/copies.rs +232 -120
  74. data/vendor/cfsolve/src/vm/interpret/evaluate/tests.rs +96 -8
  75. data/vendor/cfsolve/src/vm/interpret/evaluate.rs +219 -92
  76. data/vendor/cfsolve/src/vm/interpret/explore.rs +155 -39
  77. data/vendor/cfsolve/src/vm/interpret/frozen.rs +171 -0
  78. data/vendor/cfsolve/src/vm/interpret/intrinsic.rs +350 -0
  79. data/vendor/cfsolve/src/vm/interpret/plan.rs +71 -44
  80. data/vendor/cfsolve/src/vm/interpret/run.rs +202 -13
  81. data/vendor/cfsolve/src/vm/interpret.rs +7 -2
  82. data/vendor/cfsolve/src/vm/machine.rs +6 -2
  83. data/vendor/cfsolve/src/vm/packed_names.rs +307 -0
  84. data/vendor/cfsolve/src/vm/session.rs +36 -14
  85. data/vendor/cfsolve/src/vm/value.rs +13 -0
  86. data/vendor/cfsolve/src/vm.rs +1 -0
  87. data/vendor/cfsolve/vendor/btls-sys/src/lib.rs +3 -0
  88. metadata +13 -6
  89. data/vendor/cfsolve/src/listing/normalize.rs +0 -264
  90. data/vendor/cfsolve/src/stage2/analysis/outputs.rs +0 -327
  91. data/vendor/cfsolve/src/stage2/probes/stylesheets.rs +0 -249
  92. data/vendor/cfsolve/src/stage2/reference-expanded.json +0 -42
  93. data/vendor/cfsolve/src/stage2/session_names.rs +0 -470
@@ -30,153 +30,149 @@ pub(crate) static REFERENCE: LazyLock<Reference> = LazyLock::new(|| {
30
30
  reference
31
31
  });
32
32
 
33
- /// Collection strings including uses of names held in header registers. The original
34
- /// reference remains the stored-answer identity; this supplements its alignment evidence.
35
- pub(crate) static EXPANDED_REFERENCE: LazyLock<Reference> = LazyLock::new(|| {
36
- serde_json::from_str(include_str!("reference-expanded.json"))
37
- .expect("the expanded reference is valid JSON")
38
- });
39
-
40
33
  /// The challenge option (`_cf_chl_opt`) naming the platform segment of a probe's request path.
41
- pub(crate) const PLATFORM_OPTION: &str = "fDDOx7";
34
+ pub(crate) const PLATFORM_OPTION: &str = "_61e7550cb6b4bdd13e5e6cdf";
42
35
  /// The option holding the session's ray, which the worker fetch requests.
43
- pub(crate) const RAY_OPTION: &str = "fMrax7";
36
+ pub(crate) const RAY_OPTION: &str = "_6917f47d281ba54bc5956244";
44
37
  /// The option holding the nonce the worker fetch requests.
45
- pub(crate) const NONCE_OPTION: &str = "rziaC7";
38
+ pub(crate) const NONCE_OPTION: &str = "_ca0ac6bf4c619f1f6d77467e";
46
39
 
47
40
  /// Shared result field used by clock and private-token probes.
48
- pub(crate) const SHARED_RESULT: &str = "Qaeu2";
41
+ pub(crate) const SHARED_RESULT: &str = "_6e834e0d80e79f99f3e3c621";
49
42
 
50
43
  /// What the clock probe reports when its worker fails.
51
- pub(crate) const CLOCK_FALLBACK: &str = "FBnL2";
52
-
53
- pub(crate) const DATES_TODAY: &str = "LKWB0";
54
- pub(crate) const DATES_OFFSET: &str = "kCaP5";
55
- pub(crate) const DATES_ZONE: &str = "vFsge3";
44
+ pub(crate) const CLOCK_FALLBACK: &str = "_71ba78019b7f9643f2d8676c";
56
45
 
57
- pub(crate) const DOM_MUTATION_RESULT: &str = "yocl1";
46
+ pub(crate) const DATES_TODAY: &str = "_a614b792240c7239c3b90a0f";
47
+ pub(crate) const DATES_OFFSET: &str = "_19d2e214590e0ed54474b83f";
48
+ pub(crate) const DATES_ZONE: &str = "_6642b9bf508a9a8a56fc75a6";
58
49
 
59
- pub(crate) const NATIVE_INSPECTION_OUTPUTS: [&str; 5] =
60
- ["gOEm7", "rLrku6", "XEUHT5", "hRxVQ2", "vxrRf4"];
61
- pub(crate) const COMPUTED_STYLE_MAP: &str = "dKjG5";
62
- pub(crate) const FONT_FACE_OUTPUTS: [&str; 4] = ["IzIpb8", "kxzY1", "EgIt8", "LvRtb9"];
63
- pub(crate) const FONT_CANVAS_OUTPUTS: [&str; 3] = ["sibaD1", "uoBG2", "jrVX6"];
64
- pub(crate) const FONT_DOM_OUTPUTS: [&str; 2] = ["SUBTl0", "vqzXM2"];
65
- pub(crate) const STYLESHEET_DIGEST: &str = "VukLq9";
66
- pub(crate) const STYLESHEET_MARKER: &str = "QqUE6";
50
+ pub(crate) const DOM_MUTATION_RESULT: &str = "_38d7dd4de03b4319c02bcd23";
67
51
 
68
52
  // Environment and environment-audit names with session-specific replay patches.
69
53
 
70
54
  /// The environment probe's `document.referrer`.
71
- pub(crate) const ENVIRONMENT_REFERRER: &str = "IEoo6";
55
+ pub(crate) const ENVIRONMENT_REFERRER: &str = "_918d40e1589474fa234a7dfb";
72
56
  /// The audit's groups of readers, by the value they read.
73
- pub(crate) const ENVIRONMENT_AUDIT_GROUPS: &str = "Mrvi5";
57
+ pub(crate) const ENVIRONMENT_AUDIT_GROUPS: &str = "_ab03e54c0eaeabaaa88a79af";
74
58
  /// The audit's measured values.
75
- pub(crate) const ENVIRONMENT_AUDIT_VALUES: &str = "gVIOJ1";
59
+ pub(crate) const ENVIRONMENT_AUDIT_VALUES: &str = "_0fd3fb16d62a09a96c3011c0";
76
60
  /// Navigation decoded size minus a Server-Timing duration.
77
- pub(crate) const ENVIRONMENT_AUDIT_REDUCTION: &str = "CUFA2";
61
+ pub(crate) const ENVIRONMENT_AUDIT_REDUCTION: &str = "_a7dc0e2158b3f79371af65eb";
78
62
  /// Navigation decoded size.
79
- pub(crate) const ENVIRONMENT_AUDIT_DECODED: &str = "qYdP1";
63
+ pub(crate) const ENVIRONMENT_AUDIT_DECODED: &str = "_a7f1b9185bc330b1a3102acc";
80
64
  /// Navigation encoded size.
81
- pub(crate) const ENVIRONMENT_AUDIT_ENCODED: &str = "qivJU1";
65
+ pub(crate) const ENVIRONMENT_AUDIT_ENCODED: &str = "_0b5e100d843fbc660d3ae2e8";
82
66
  /// Whether the probe's frame supports touch events.
83
- pub(crate) const ENVIRONMENT_AUDIT_TOUCH: &str = "EuKni3";
67
+ pub(crate) const ENVIRONMENT_AUDIT_TOUCH: &str = "_40f087c21d8a2e447e2016d2";
84
68
  /// The probe frame's `isSecureContext` value.
85
- pub(crate) const ENVIRONMENT_AUDIT_SECURE: &str = "CvjRv6";
69
+ pub(crate) const ENVIRONMENT_AUDIT_SECURE: &str = "_a09c662213172dfdf7fe11cd";
86
70
  /// The value of `Notification.permission`.
87
- pub(crate) const ENVIRONMENT_AUDIT_PERMISSION: &str = "VJeMl3";
71
+ pub(crate) const ENVIRONMENT_AUDIT_PERMISSION: &str = "_f1e2967f23abbbf676f8a3a9";
88
72
 
89
- pub(crate) const ERROR_MESSAGE_LENGTH_RESULT: &str = "tbCpm1";
73
+ /// The isolation probe's results for blocked evaluation and cross-origin history writes.
74
+ pub(crate) const ISOLATION_FAILURE_FIELDS: [&str; 2] =
75
+ ["_4dab37431407f6aa72aa262d", "_7ca4f44cb8e7aaf5802217d5"];
76
+ pub(crate) const STYLESHEETS_TEXT: &str = "_2da798f52f05c8e2a3575e52";
77
+ pub(crate) const STYLESHEETS_HASH: &str = "_3d4d40ff2e985151f19ad154";
90
78
 
91
- pub(crate) const IMAGE_WIDTH: &str = "HOfsc5";
92
- pub(crate) const IMAGE_HEIGHT: &str = "CfxW8";
93
- pub(crate) const IMAGE_EFFECTIVE_TYPE: &str = "JZpKs0";
94
- pub(crate) const IMAGE_ONLINE: &str = "WnDqR8";
95
- pub(crate) const IMAGE_COMPLETE: &str = "eCvhB6";
96
- pub(crate) const IMAGE_NATURAL_WIDTH: &str = "tZqBF5";
97
- pub(crate) const IMAGE_TIMESTAMP: &str = "TRPPv6";
79
+ pub(crate) const ERROR_MESSAGE_LENGTH_RESULT: &str = "_0d4993e111c0f8ff7cb86b23";
80
+
81
+ pub(crate) const IMAGE_WIDTH: &str = "_c937904afdbf6a962a495698";
82
+ pub(crate) const IMAGE_HEIGHT: &str = "_73085dbd94bdf2f4a55ea8d4";
83
+ pub(crate) const IMAGE_EFFECTIVE_TYPE: &str = "_bd02f25dbe60a1cd3392f2a1";
84
+ pub(crate) const IMAGE_ONLINE: &str = "_1284c12e9b3dc9629a99b60e";
85
+ pub(crate) const IMAGE_COMPLETE: &str = "_899febc1aed6643cb3bdd449";
86
+ pub(crate) const IMAGE_NATURAL_WIDTH: &str = "_869abd1318296f606f53f835";
87
+ pub(crate) const IMAGE_TIMESTAMP: &str = "_52ffb507df01acf3dec37475";
98
88
  /// What the probe reports as both dimensions when the image fails to load.
99
- pub(crate) const IMAGE_LOAD_ERROR: &str = "jThV9";
89
+ pub(crate) const IMAGE_LOAD_ERROR: &str = "_0d9880b397052efc378cd26b";
100
90
  /// Dimension values reported before the image load finishes.
101
- pub(crate) const IMAGE_PENDING: &str = "YyBlg5";
91
+ pub(crate) const IMAGE_PENDING: &str = "_976c7c9cab404c1b8b94b9f4";
102
92
  /// The key the probe's worker replies with when its deadline passes.
103
- pub(crate) const IMAGE_WORKER_TIMEOUT: &str = "uIVWw9";
93
+ pub(crate) const IMAGE_WORKER_TIMEOUT: &str = "_5e5d151d1f58f76e7c42c1d6";
104
94
  /// A name the probe shares with the other probes that await a promise.
105
- pub(crate) const IMAGE_AWAITING: &str = "BQsv4";
95
+ pub(crate) const IMAGE_AWAITING: &str = "_043b45997a2670daf27b7021";
106
96
 
107
- pub(crate) const MEDIA_STATE: &str = "cHOXt5";
108
- pub(crate) const MEDIA_CODECS: &str = "jmcNk6";
109
- pub(crate) const MEDIA_CANDIDATES: &str = "CGqF5";
110
- pub(crate) const MEDIA_SDP: &str = "XmGk2";
111
- pub(crate) const MEDIA_SUPPORT: &str = "nOyvn6";
112
- pub(crate) const MEDIA_ICE_STATE: &str = "THSa3";
113
- pub(crate) const MEDIA_UNAVAILABLE: &str = "tGDM7";
114
- pub(crate) const MEDIA_CANDIDATE: &str = "IujZl5";
115
- pub(crate) const MEDIA_CANDIDATE_TIME: &str = "ujwxq5";
116
- pub(crate) const MEDIA_DATA_CHANNEL: &str = "DGSE1";
117
- pub(crate) const MEDIA_REUSED: &str = "fylY5";
118
- pub(crate) const MEDIA_PRIOR_COUNT: &str = "xwFV8";
119
- pub(crate) const MEDIA_FIRST_CANDIDATE: &str = "lgnB3";
120
- pub(crate) const MEDIA_ELAPSED: &str = "EufTm2";
121
- pub(crate) const MEDIA_CHANNEL_ERROR: &str = "TYVmT3";
122
- pub(crate) const MEDIA_SEED_OFFER_ERROR: &str = "wnGKN3";
123
- pub(crate) const MEDIA_SEED_GATHER_ERROR: &str = "RczL3";
97
+ pub(crate) const MEDIA_STATE: &str = "_da7bc3a155dca43d5b49f1fa";
98
+ pub(crate) const MEDIA_CODECS: &str = "_4213e832a7feb534313b4f39";
99
+ pub(crate) const MEDIA_CANDIDATES: &str = "_e63a20d14646da909acd55f9";
100
+ pub(crate) const MEDIA_SDP: &str = "_8de55a1f52d181e06ccbbe8b";
101
+ pub(crate) const MEDIA_SUPPORT: &str = "_d702e8115f0b764649363d3d";
102
+ pub(crate) const MEDIA_ICE_STATE: &str = "_c3a7b9dd369b66837d9e7f98";
103
+ pub(crate) const MEDIA_UNAVAILABLE: &str = "_9797a3d5bb0f64080d0d214c";
104
+ pub(crate) const MEDIA_CANDIDATE: &str = "_ae22777f7d3d713e841feca5";
105
+ pub(crate) const MEDIA_CANDIDATE_TIME: &str = "_ca5e7a972d36bf952fbf09c5";
106
+ pub(crate) const MEDIA_DATA_CHANNEL: &str = "_4b86eecf1feba1c6b48c4292";
107
+ pub(crate) const MEDIA_REUSED: &str = "_fb480f4b21b6c9b3d1d979a4";
108
+ pub(crate) const MEDIA_PRIOR_COUNT: &str = "_a443a02c5d78d387b779d0b3";
109
+ pub(crate) const MEDIA_FIRST_CANDIDATE: &str = "_a3e7026918f5e4d34d5865ac";
110
+ pub(crate) const MEDIA_ELAPSED: &str = "_b2327e7a4a9eb807909c1741";
111
+ pub(crate) const MEDIA_CHANNEL_ERROR: &str = "_64a8b5f81817b0e33dd1751b";
112
+ pub(crate) const MEDIA_SEED_OFFER_ERROR: &str = "_f6d7e9eeabea462322f299fa";
113
+ pub(crate) const MEDIA_SEED_GATHER_ERROR: &str = "_183cd094666f8d499a59c133";
124
114
 
125
115
  /// Recognition recovers the network information probe's output names from the probe itself.
126
116
  #[cfg(test)]
127
- pub(crate) const NETWORK_INFORMATION_OUTPUTS: [&str; 6] =
128
- ["yrECR4", "RAgG0", "PLgV4", "ofXXp7", "OyWi8", "DLxCG4"];
117
+ pub(crate) const NETWORK_INFORMATION_OUTPUTS: [&str; 6] = [
118
+ "_6e966490231e673457e97a79",
119
+ "_e56b5c0ff1f6c80af985ffa7",
120
+ "_e2911f4822a370d64b43df18",
121
+ "_9b899864a6fdfdc9e455943b",
122
+ "_1a2b017fe7e3665eae6f45e2",
123
+ "_6755e905972745530aa44b2b",
124
+ ];
129
125
 
130
- pub(crate) const PARENT_INFO_REFERRER: &str = "TntMf7";
131
- pub(crate) const PARENT_INFO_MISSING: &str = "OwMo9";
132
- pub(crate) const PARENT_INFO_REASONS: &str = "mXVtS4";
133
- pub(crate) const PARENT_INFO_VISIBILITY: &str = "zSEUs9";
126
+ pub(crate) const PARENT_INFO_REFERRER: &str = "_31a6173d1692e77e5a1005d5";
127
+ pub(crate) const PARENT_INFO_MISSING: &str = "_10450802c4fb954516e0c07b";
128
+ pub(crate) const PARENT_INFO_REASONS: &str = "_cd7d13df270697c8781d261c";
129
+ pub(crate) const PARENT_INFO_VISIBILITY: &str = "_4172551fe148377bcda1f7b5";
134
130
  /// The output the embedding page's `pad` property is copied to.
135
- pub(crate) const PARENT_INFO_PAD: &str = "xNWk9";
131
+ pub(crate) const PARENT_INFO_PAD: &str = "_e5caf599351485e860642415";
136
132
  /// Pairs of output fields and parent-info properties copied directly.
137
133
  pub(crate) const PARENT_INFO_DIRECT: [(&str, &str); 16] = [
138
- ("Phksv2", "vDuh"),
139
- ("Rsffu5", "vDie"),
140
- ("CQoR0", "xp"),
141
- ("mkXM4", "wp"),
142
- ("ruEU0", "pfp"),
143
- ("dkJa8", "sL"),
144
- ("RjDt7", "ssL"),
145
- ("Uiqbe2", "mL"),
146
- ("rQKmV0", "t"),
147
- ("Bfav1", "tL"),
148
- ("mTKb7", "lH"),
149
- ("JpisX5", "sR"),
150
- ("VQgE2", "ii"),
151
- ("CPzGA2", "ffp"),
152
- ("HQKw3", "pac"),
134
+ ("_6e1dc8b6953acf52c04a8602", "vDuh"),
135
+ ("_4f08666db7270b9f907f663c", "vDie"),
136
+ ("_c8cb367a7b94d575149530e3", "xp"),
137
+ ("_5ef82acb130f4537ed9aac35", "wp"),
138
+ ("_62193c48d482daf2700a995c", "pfp"),
139
+ ("_1c113a764991c259adfcf85b", "sL"),
140
+ ("_3da484dbed1006c654fac96e", "ssL"),
141
+ ("_c74be140015d9b0e3d256c48", "mL"),
142
+ ("_d6f250eb3d24cd44d78bab61", "t"),
143
+ ("_1d5d7b99f35d507b3a08a437", "tL"),
144
+ ("_af146df9ca80117c88f514dd", "lH"),
145
+ ("_cf3a9d328d85b9c7f2ae9457", "sR"),
146
+ ("_4c7024270fd2a920c7ce5503", "ii"),
147
+ ("_e4689550ed6807ca8acfeff4", "ffp"),
148
+ ("_fd302ee89388067a1cfa51d9", "pac"),
153
149
  (PARENT_INFO_PAD, "pad"),
154
150
  ];
155
151
  /// Pairs of output fields and parent-info properties copied with an empty-string fallback for
156
152
  /// falsy values.
157
153
  pub(crate) const PARENT_INFO_FALLBACK: [(&str, &str); 4] = [
158
- ("mFggz8", "vDmt"),
159
- ("XZjP7", "vDhp"),
160
- ("iFsu6", "vDmd"),
161
- ("ZRfV0", "vDa"),
154
+ ("_3bce4851046c22ddb9da2a5b", "vDmt"),
155
+ ("_70346a8995cdbf5b1cd02bc7", "vDhp"),
156
+ ("_d9c1b344a652122a42aa8fdf", "vDmd"),
157
+ ("_1b4e766af5a14e457b0a4459", "vDa"),
162
158
  ];
163
159
 
164
- pub(crate) const PRIVATE_TOKEN_ELAPSED: &str = "msMJz1";
165
- pub(crate) const PRIVATE_TOKEN_ERROR: &str = "AYvz5";
166
- pub(crate) const PRIVATE_TOKEN_TOKEN: &str = "tiZRS0";
167
- pub(crate) const PRIVATE_TOKEN_TIMESTAMP: &str = "xDpHl7";
160
+ pub(crate) const PRIVATE_TOKEN_ELAPSED: &str = "_3a403a5bfbe5ad79fcb6d7fa";
161
+ pub(crate) const PRIVATE_TOKEN_ERROR: &str = "_11fe3c7cf759c9e85c056175";
162
+ pub(crate) const PRIVATE_TOKEN_TOKEN: &str = "_8c0a7d305ce60d56c7e050e0";
163
+ pub(crate) const PRIVATE_TOKEN_TIMESTAMP: &str = "_c323fa9d32f21c57738f2d52";
168
164
  /// The error the probe reports when its worker reaches its deadline.
169
- pub(crate) const PRIVATE_TOKEN_TIMEOUT_ERROR: &str = "EgIt8";
165
+ pub(crate) const PRIVATE_TOKEN_TIMEOUT_ERROR: &str = "_86c0f719c753efd2add5a423";
170
166
  /// The flag every reply of the probe's worker sets.
171
- pub(crate) const PRIVATE_TOKEN_WORKER_REPLIED: &str = "KQxI9";
167
+ pub(crate) const PRIVATE_TOKEN_WORKER_REPLIED: &str = "_502dfebb48ad4577f94b398b";
172
168
  /// The reply field holding the worker fetch error.
173
- pub(crate) const PRIVATE_TOKEN_WORKER_ERROR: &str = "mGLF5";
169
+ pub(crate) const PRIVATE_TOKEN_WORKER_ERROR: &str = "_1bd19da8fe35caf76f114593";
174
170
 
175
- pub(crate) const WORKER_FETCH_STATUS: &str = "NChzJ9";
176
- pub(crate) const WORKER_FETCH_TOKEN: &str = "npLu3";
171
+ pub(crate) const WORKER_FETCH_STATUS: &str = "_450ac63dd9d56cfdc07a45a6";
172
+ pub(crate) const WORKER_FETCH_TOKEN: &str = "_6c33957a5fcf43fae4182402";
177
173
 
178
- pub(crate) const WORKER_NAVIGATOR_INDICATOR: &str = "IOca9";
179
- pub(crate) const WORKER_NAVIGATOR_RESULT: &str = "DIEq4";
174
+ pub(crate) const WORKER_NAVIGATOR_INDICATOR: &str = "_85ce50de34c865aae5312e53";
175
+ pub(crate) const WORKER_NAVIGATOR_RESULT: &str = "_f436ec62fa333f0b9cd2d3a4";
180
176
 
181
177
  #[cfg(test)]
182
178
  mod tests {
@@ -193,6 +189,8 @@ mod tests {
193
189
  (Kind::DateParsingOffsets, DATES_ZONE),
194
190
  (Kind::DomMutation, DOM_MUTATION_RESULT),
195
191
  (Kind::Environment, ENVIRONMENT_REFERRER),
192
+ (Kind::Stylesheets, STYLESHEETS_TEXT),
193
+ (Kind::Stylesheets, STYLESHEETS_HASH),
196
194
  (Kind::EnvironmentAudit, ENVIRONMENT_AUDIT_GROUPS),
197
195
  (Kind::EnvironmentAudit, ENVIRONMENT_AUDIT_VALUES),
198
196
  (Kind::EnvironmentAudit, ENVIRONMENT_AUDIT_REDUCTION),
@@ -157,65 +157,65 @@ macro_rules! families {
157
157
 
158
158
  families! {
159
159
  Media { fields: Box<media::Fields> } =>
160
- media, "media", Reference, Computed, [16];
160
+ media, "media", Reference, Computed, [32];
161
161
  PrivateToken { fields: private_token::Fields } =>
162
- private_token, "private_token", Reference, Computed, [4];
162
+ private_token, "private_token", Reference, Computed, [5];
163
163
  WorkerFetch { fields: worker_fetch::Fields } =>
164
- worker_fetch, "worker_fetch", Reference, Computed, [5];
164
+ worker_fetch, "worker_fetch", Reference, Computed, [4];
165
165
  Image { fields: image::Fields } =>
166
- image, "image", Reference, Computed, [30];
166
+ image, "image", Reference, Computed, [33];
167
167
  ParentInfo {} =>
168
- parent_info, "parent_info", Reference, Computed, [24];
168
+ parent_info, "parent_info", Reference, Computed, [7];
169
169
  DateParsingOffsets(dates::Fields) =>
170
- dates, "date_parsing_offsets", Reference, Computed, [38];
170
+ dates, "date_parsing_offsets", Reference, Computed, [21];
171
171
  // The payload publishes the error-message length beside the record.
172
172
  ErrorMessageLength {} =>
173
173
  error_message_length, "error_message_length", Reference, Replayed, [3];
174
174
  NetworkInformation(network_information::Fields) =>
175
- network_information, "network_information", Reference, Computed, [29];
175
+ network_information, "network_information", Reference, Computed, [25];
176
176
  WorkerNavigator(worker_navigator::Fields) =>
177
177
  worker_navigator, "worker_navigator", Reference, Computed, [1];
178
178
  ClockResolution {} =>
179
- clock, "clock_resolution", Reference, Computed, [9];
179
+ clock, "clock_resolution", Reference, Computed, [8];
180
180
  Benchmark { fields: benchmark::Fields } =>
181
181
  benchmark, "benchmark", Structural, Computed, [];
182
182
  // Element ID queries from this probe appear in the selector log.
183
183
  Rects { fields: rects::Fields } =>
184
- rects, "rects", Structural, Replayed, [37];
184
+ rects, "rects", Structural, Replayed, [29];
185
185
  DomMutation { fields: dom_mutation::Fields } =>
186
- dom_mutation, "dom_mutation", Structural, Computed, [17];
186
+ dom_mutation, "dom_mutation", Structural, Computed, [18];
187
187
  PerformanceEntries { fields: performance::Fields } =>
188
- performance, "performance_entries", Structural, Computed, [36];
188
+ performance, "performance_entries", Structural, Computed, [30];
189
189
  // Rebuilt from the session's own script. The reference build's stack probe is probe 28.
190
190
  Stack { fields: stack::Fields } =>
191
191
  stack, "stack", Structural, Computed, [28];
192
192
  HostReachability { fields: host_reachability::Fields } =>
193
193
  host_reachability, "host_reachability", Structural, Computed, [];
194
194
  WebSocketEcho { fields: websocket_echo::Fields } =>
195
- websocket_echo, "websocket_echo", Structural, Computed, [];
196
- @empty [11, 26, 33];
195
+ websocket_echo, "websocket_echo", Structural, Computed, [6];
196
+ @empty [10, 24, 39];
197
197
  @replayed {
198
198
  EnvironmentAudit => "environment_audit", 2;
199
- Environment => "environment", 6;
200
- HighEntropyUserAgent => "high_entropy_user_agent", 7;
201
- EmojiColor => "emoji_color", 8;
202
- Behavior => "behavior", 10;
203
- KeyboardLayout => "keyboard_layout", 12;
204
- Console => "console", 13;
205
- Math => "math", 14;
206
- DocumentStructure => "document_structure", 15;
207
- Graphics => "graphics", 18;
208
- SvgGeometry => "svg_geometry", 19;
209
- SummarizerAvailability => "summarizer_availability", 20;
210
- Audio => "audio", 21;
211
- NativeInspection => "native_inspection", 22;
212
- FontEnumeration => "font_enumeration", 23;
213
- DocumentSummary => "document_summary", 25;
214
- ComputedStyleHash => "computed_style_hash", 27;
215
- Intl => "intl", 31;
216
- Storage => "storage", 32;
217
- Stylesheets => "stylesheets", 34;
218
- Isolation => "isolation", 35;
199
+ Environment => "environment", 35;
200
+ HighEntropyUserAgent => "high_entropy_user_agent", 12;
201
+ EmojiColor => "emoji_color", 19;
202
+ Behavior => "behavior", 9;
203
+ KeyboardLayout => "keyboard_layout", 13;
204
+ Console => "console", 36;
205
+ Math => "math", 26;
206
+ DocumentStructure => "document_structure", 20;
207
+ Graphics => "graphics", 37;
208
+ SvgGeometry => "svg_geometry", 15;
209
+ SummarizerAvailability => "summarizer_availability", 17;
210
+ Audio => "audio", 38;
211
+ NativeInspection => "native_inspection", 16;
212
+ FontEnumeration => "font_enumeration", 27;
213
+ DocumentSummary => "document_summary", 34;
214
+ ComputedStyleHash => "computed_style_hash", 23;
215
+ Intl => "intl", 14;
216
+ Storage => "storage", 11;
217
+ Stylesheets => "stylesheets", 31;
218
+ Isolation => "isolation", 22;
219
219
  }
220
220
  }
221
221
 
@@ -309,11 +309,18 @@ impl Observed {
309
309
  }
310
310
 
311
311
  impl Operation {
312
- /// Tries reference recognizers, then structural ones, and returns the first match.
312
+ /// Tries reference recognizers, then structural ones, and returns the first match. A paired
313
+ /// probe only matches families including its partner, as hex-name builds reuse result names.
313
314
  #[must_use]
314
315
  pub(crate) fn recognize(probe: &ProbeView<'_>) -> Option<Self> {
316
+ let partner = probe.vocabulary.partner(probe.position);
317
+ let fits = |kind: &Kind| {
318
+ let references = kind.references();
319
+ references.is_empty() || partner.is_none_or(|partner| references.contains(&partner))
320
+ };
315
321
  Kind::in_phase(Phase::Reference)
316
322
  .chain(Kind::in_phase(Phase::Structural))
323
+ .filter(fits)
317
324
  .find_map(|kind| kind.recognize(probe))
318
325
  }
319
326