@elliemae/ssf-host 2.23.4 → 2.24.0

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 (91) hide show
  1. package/dist/cjs/callchain-host.html +262 -0
  2. package/dist/cjs/callchain-intermediate.html +92 -0
  3. package/dist/cjs/e2e-host.html +603 -0
  4. package/dist/cjs/e2e-index.html +234 -0
  5. package/dist/cjs/host.js +100 -43
  6. package/dist/cjs/index.html +304 -151
  7. package/dist/cjs/popup-focus-host.html +318 -0
  8. package/dist/cjs/utils.js +14 -1
  9. package/dist/cjs/v2-host-v1-guest.html +3 -0
  10. package/dist/esm/callchain-host.html +262 -0
  11. package/dist/esm/callchain-intermediate.html +92 -0
  12. package/dist/esm/e2e-host.html +603 -0
  13. package/dist/esm/e2e-index.html +234 -0
  14. package/dist/esm/host.js +101 -44
  15. package/dist/esm/index.html +304 -151
  16. package/dist/esm/popup-focus-host.html +318 -0
  17. package/dist/esm/utils.js +14 -1
  18. package/dist/esm/v2-host-v1-guest.html +3 -0
  19. package/dist/public/callchain-host.html +34 -0
  20. package/dist/public/callchain-host.js +3 -0
  21. package/dist/public/callchain-host.js.br +0 -0
  22. package/dist/public/callchain-host.js.gz +0 -0
  23. package/dist/public/callchain-host.js.map +1 -0
  24. package/dist/public/callchain-intermediate.html +1 -0
  25. package/dist/public/e2e-host.html +5 -0
  26. package/dist/public/e2e-host.js +8 -0
  27. package/dist/public/e2e-host.js.br +0 -0
  28. package/dist/public/e2e-host.js.gz +0 -0
  29. package/dist/public/e2e-host.js.map +1 -0
  30. package/dist/public/e2e-index.html +1 -0
  31. package/dist/public/index.html +1 -1
  32. package/dist/public/init.js +1 -1
  33. package/dist/public/init.js.br +0 -0
  34. package/dist/public/init.js.gz +0 -0
  35. package/dist/public/init.js.map +1 -1
  36. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js +3 -0
  37. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.br +0 -0
  38. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.gz +0 -0
  39. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.map +1 -0
  40. package/dist/public/loan-object.js +1 -1
  41. package/dist/public/loan-object.js.br +0 -0
  42. package/dist/public/loan-object.js.gz +0 -0
  43. package/dist/public/loan-object.js.map +1 -1
  44. package/dist/public/popup-focus-host.html +1 -0
  45. package/dist/public/popup-focus-host.js +6 -0
  46. package/dist/public/popup-focus-host.js.br +0 -0
  47. package/dist/public/popup-focus-host.js.gz +0 -0
  48. package/dist/public/popup-focus-host.js.map +1 -0
  49. package/dist/public/v1-guest-v2-host.html +1 -1
  50. package/dist/public/v2-host-v1-guest.html +1 -1
  51. package/dist/types/lib/host.d.ts +1 -0
  52. package/dist/types/lib/ihost.d.ts +15 -0
  53. package/dist/types/lib/tests/timingDedup.test.d.ts +1 -0
  54. package/dist/types/lib/utils.d.ts +1 -0
  55. package/dist/types/tsconfig.tsbuildinfo +1 -1
  56. package/dist/umd/callchain-host.html +34 -0
  57. package/dist/umd/callchain-host.js +3 -0
  58. package/dist/umd/callchain-host.js.br +0 -0
  59. package/dist/umd/callchain-host.js.gz +0 -0
  60. package/dist/umd/callchain-host.js.map +1 -0
  61. package/dist/umd/callchain-intermediate.html +1 -0
  62. package/dist/umd/e2e-host.html +5 -0
  63. package/dist/umd/e2e-host.js +8 -0
  64. package/dist/umd/e2e-host.js.br +0 -0
  65. package/dist/umd/e2e-host.js.gz +0 -0
  66. package/dist/umd/e2e-host.js.map +1 -0
  67. package/dist/umd/e2e-index.html +1 -0
  68. package/dist/umd/index.html +1 -1
  69. package/dist/umd/index.js +1 -1
  70. package/dist/umd/index.js.br +0 -0
  71. package/dist/umd/index.js.gz +0 -0
  72. package/dist/umd/index.js.map +1 -1
  73. package/dist/umd/init.js +1 -1
  74. package/dist/umd/init.js.br +0 -0
  75. package/dist/umd/init.js.gz +0 -0
  76. package/dist/umd/init.js.map +1 -1
  77. package/dist/umd/loan-object.js +1 -1
  78. package/dist/umd/loan-object.js.br +0 -0
  79. package/dist/umd/loan-object.js.gz +0 -0
  80. package/dist/umd/loan-object.js.map +1 -1
  81. package/dist/umd/popup-focus-host.html +1 -0
  82. package/dist/umd/popup-focus-host.js +6 -0
  83. package/dist/umd/popup-focus-host.js.br +0 -0
  84. package/dist/umd/popup-focus-host.js.gz +0 -0
  85. package/dist/umd/popup-focus-host.js.map +1 -0
  86. package/dist/umd/v2-host-v1-guest.html +1 -1
  87. package/package.json +5 -5
  88. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js +0 -3
  89. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.br +0 -0
  90. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.gz +0 -0
  91. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.map +0 -1
@@ -0,0 +1,603 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>SSF E2E — Comprehensive Host Test</title>
7
+ <script src="https://cdn.tailwindcss.com?plugins=forms"></script>
8
+ <script src="https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3"></script>
9
+ </head>
10
+ <body class="bg-gray-50 text-sm">
11
+ <header
12
+ class="bg-indigo-700 text-white px-4 py-3 flex items-center justify-between"
13
+ >
14
+ <h1 class="text-lg font-semibold">Comprehensive E2E Host Test</h1>
15
+ <a
16
+ href="./e2e-index.html"
17
+ class="text-indigo-200 hover:text-white text-sm"
18
+ >&larr; Test Suite</a
19
+ >
20
+ </header>
21
+
22
+ <main class="mx-auto max-w-7xl px-4 py-3">
23
+ <!-- Instructions -->
24
+ <div class="grid grid-cols-2 gap-3 mb-3">
25
+ <div class="bg-blue-50 border border-blue-200 rounded-md p-3">
26
+ <h2 class="text-sm font-bold text-blue-900 mb-1">
27
+ How to Use This Page
28
+ </h2>
29
+ <ol class="text-xs text-blue-800 space-y-1 list-decimal list-inside">
30
+ <li>
31
+ Start the host dev server (port 4000) and guest dev server (port
32
+ 4001).
33
+ </li>
34
+ <li>
35
+ Buttons in <strong>Column 1</strong> (left) execute host-side
36
+ actions.
37
+ </li>
38
+ <li>
39
+ <strong>Column 2</strong> (center) shows embedded guest iframes —
40
+ interact with them to invoke methods, subscribe to events, etc.
41
+ </li>
42
+ <li>
43
+ <strong>Column 3</strong> (right) shows live results: Event Log,
44
+ callContext, dispatch results, and the guest list.
45
+ </li>
46
+ <li>
47
+ Work through the buttons <strong>top to bottom</strong> for the
48
+ recommended flow. Each button is labelled with a test case ID
49
+ (TC-xxx).
50
+ </li>
51
+ </ol>
52
+ </div>
53
+ <div class="bg-amber-50 border border-amber-200 rounded-md p-3">
54
+ <h2 class="text-sm font-bold text-amber-900 mb-1">
55
+ Recommended Flow
56
+ </h2>
57
+ <ol class="text-xs text-amber-800 space-y-1 list-decimal list-inside">
58
+ <li>
59
+ <strong>Load guests</strong>: TC-LOAD-01 (embed) → TC-LOAD-02
60
+ (popup) → TC-LOAD-04 (with params). Check Event Log for "loaded"
61
+ messages.
62
+ </li>
63
+ <li>
64
+ <strong>Scripting objects</strong>: TC-SO-01 (add Inventory). In
65
+ the guest iframe, call <code>getObject("Inventory")</code> and
66
+ invoke <code>getStock()</code>. Check return value and
67
+ callContext.
68
+ </li>
69
+ <li>
70
+ <strong>Events</strong>: In the guest, subscribe to
71
+ <code>Loan.onPreSave</code>. Then click TC-EVT-01 on the host.
72
+ Guest should receive the event.
73
+ </li>
74
+ <li>
75
+ <strong>Lifecycle</strong>: TC-LIFE-01 (unload), TC-LIFE-03 (close
76
+ host). Verify guests are removed and host is destroyed.
77
+ </li>
78
+ </ol>
79
+ </div>
80
+ </div>
81
+
82
+ <div class="grid grid-cols-3 gap-3">
83
+ <!-- Column 1: Host Controls -->
84
+ <div class="space-y-3">
85
+ <!-- Section: Guest Loading -->
86
+ <div class="bg-white rounded-lg shadow p-3">
87
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
88
+ Guest Loading
89
+ </h2>
90
+ <div class="space-y-2">
91
+ <button
92
+ data-testid="btn-load-embed"
93
+ id="btnLoadEmbed"
94
+ class="w-full rounded bg-indigo-600 px-3 py-1.5 text-xs text-white hover:bg-indigo-700"
95
+ >
96
+ TC-LOAD-01: Load Embedded Guest
97
+ </button>
98
+ <p class="text-[10px] text-gray-400 -mt-1">
99
+ Expected: guest iframe appears in center column, log shows
100
+ "loaded"
101
+ </p>
102
+ <button
103
+ data-testid="btn-load-popup"
104
+ id="btnLoadPopup"
105
+ class="w-full rounded bg-indigo-600 px-3 py-1.5 text-xs text-white hover:bg-indigo-700"
106
+ >
107
+ TC-LOAD-02: Load Popup Guest
108
+ </button>
109
+ <p class="text-[10px] text-gray-400 -mt-1">
110
+ Expected: new browser popup window opens
111
+ </p>
112
+ <button
113
+ data-testid="btn-load-multiple"
114
+ id="btnLoadMultiple"
115
+ class="w-full rounded bg-indigo-600 px-3 py-1.5 text-xs text-white hover:bg-indigo-700"
116
+ >
117
+ TC-LOAD-03: loadGuests (3 instances)
118
+ </button>
119
+ <p class="text-[10px] text-gray-400 -mt-1">
120
+ Expected: 3 guest iframes load, "List all guests" shows 3+
121
+ entries
122
+ </p>
123
+ <button
124
+ data-testid="btn-load-with-params"
125
+ id="btnLoadWithParams"
126
+ class="w-full rounded bg-indigo-600 px-3 py-1.5 text-xs text-white hover:bg-indigo-700"
127
+ >
128
+ TC-LOAD-04: Load with searchParams
129
+ </button>
130
+ <p class="text-[10px] text-gray-400 -mt-1">
131
+ Expected: guest shows URL params in its "Params:" line
132
+ </p>
133
+ <button
134
+ data-testid="btn-load-with-metadata"
135
+ id="btnLoadWithMetadata"
136
+ class="w-full rounded bg-indigo-600 px-3 py-1.5 text-xs text-white hover:bg-indigo-700"
137
+ >
138
+ TC-META-01: Load with metadata
139
+ </button>
140
+ <p class="text-[10px] text-gray-400 -mt-1">
141
+ Expected: when guest invokes a method, callContext.callChain
142
+ shows metadata
143
+ </p>
144
+ <button
145
+ data-testid="btn-load-bad-url"
146
+ id="btnLoadBadUrl"
147
+ class="w-full rounded bg-red-600 px-3 py-1.5 text-xs text-white hover:bg-red-700"
148
+ >
149
+ TC-LOAD-05: Load invalid URL (onError)
150
+ </button>
151
+ <p class="text-[10px] text-gray-400 -mt-1">
152
+ Expected: log shows "ERROR" or onError callback fires
153
+ </p>
154
+ </div>
155
+ </div>
156
+
157
+ <!-- Section: Scripting Object Management -->
158
+ <div class="bg-white rounded-lg shadow p-3">
159
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
160
+ Scripting Object Management
161
+ </h2>
162
+ <div class="space-y-2">
163
+ <button
164
+ data-testid="btn-add-so"
165
+ id="btnAddSO"
166
+ class="w-full rounded bg-green-600 px-3 py-1.5 text-xs text-white hover:bg-green-700"
167
+ >
168
+ TC-SO-01: Add "Inventory" Object
169
+ </button>
170
+ <p class="text-[10px] text-gray-400 -mt-1">
171
+ Expected: guest can now <code>getObject("Inventory")</code> and
172
+ invoke its methods
173
+ </p>
174
+ <button
175
+ data-testid="btn-add-guest-so"
176
+ id="btnAddGuestSO"
177
+ class="w-full rounded bg-green-600 px-3 py-1.5 text-xs text-white hover:bg-green-700"
178
+ >
179
+ TC-SO-04: Add Guest-Scoped Object
180
+ </button>
181
+ <p class="text-[10px] text-gray-400 -mt-1">
182
+ Expected: only the target guest can access this object, others
183
+ get "not available"
184
+ </p>
185
+ <button
186
+ data-testid="btn-remove-so"
187
+ id="btnRemoveSO"
188
+ class="w-full rounded bg-yellow-600 px-3 py-1.5 text-xs text-white hover:bg-yellow-700"
189
+ >
190
+ TC-SO-02: Remove "Inventory" Object
191
+ </button>
192
+ <p class="text-[10px] text-gray-400 -mt-1">
193
+ Expected: guest's <code>getObject("Inventory")</code> now fails
194
+ </p>
195
+ <button
196
+ data-testid="btn-remove-all-so"
197
+ id="btnRemoveAllSO"
198
+ class="w-full rounded bg-yellow-600 px-3 py-1.5 text-xs text-white hover:bg-yellow-700"
199
+ >
200
+ TC-SO-02b: Remove All Objects
201
+ </button>
202
+ <p class="text-[10px] text-gray-400 -mt-1">
203
+ Expected: all getObject calls fail until objects are re-added
204
+ </p>
205
+ </div>
206
+ </div>
207
+
208
+ <!-- Section: Event Dispatching -->
209
+ <div class="bg-white rounded-lg shadow p-3">
210
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
211
+ Event Dispatching
212
+ </h2>
213
+ <div class="space-y-2">
214
+ <button
215
+ data-testid="btn-dispatch-all"
216
+ id="btnDispatchAll"
217
+ class="w-full rounded bg-purple-600 px-3 py-1.5 text-xs text-white hover:bg-purple-700"
218
+ >
219
+ TC-EVT-01: Dispatch onPreSave to all
220
+ </button>
221
+ <p class="text-[10px] text-gray-400 -mt-1">
222
+ Expected: all guests subscribed to onPreSave receive the event
223
+ </p>
224
+ <button
225
+ data-testid="btn-dispatch-targeted"
226
+ id="btnDispatchTargeted"
227
+ class="w-full rounded bg-purple-600 px-3 py-1.5 text-xs text-white hover:bg-purple-700"
228
+ >
229
+ TC-EVT-02: Dispatch to specific guest
230
+ </button>
231
+ <p class="text-[10px] text-gray-400 -mt-1">
232
+ Expected: only the targeted guest receives the event
233
+ </p>
234
+ <button
235
+ data-testid="btn-dispatch-feedback"
236
+ id="btnDispatchFeedback"
237
+ class="w-full rounded bg-purple-600 px-3 py-1.5 text-xs text-white hover:bg-purple-700"
238
+ >
239
+ TC-EVT-03: Dispatch with timeout (feedback)
240
+ </button>
241
+ <p class="text-[10px] text-gray-400 -mt-1">
242
+ Expected: Dispatch Results shows the guest's feedback return
243
+ value
244
+ </p>
245
+ <button
246
+ data-testid="btn-dispatch-amount"
247
+ id="btnDispatchAmount"
248
+ class="w-full rounded bg-purple-600 px-3 py-1.5 text-xs text-white hover:bg-purple-700"
249
+ >
250
+ TC-EVT-04: Dispatch onAmountChanged (criteria)
251
+ </button>
252
+ <p class="text-[10px] text-gray-400 -mt-1">
253
+ Expected: only guests subscribed with matching criteria receive
254
+ it
255
+ </p>
256
+ </div>
257
+ </div>
258
+
259
+ <!-- Section: Guest Lifecycle -->
260
+ <div class="bg-white rounded-lg shadow p-3">
261
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
262
+ Guest Lifecycle
263
+ </h2>
264
+ <div class="space-y-2">
265
+ <button
266
+ data-testid="btn-unload-guest"
267
+ id="btnUnloadGuest"
268
+ class="w-full rounded bg-orange-600 px-3 py-1.5 text-xs text-white hover:bg-orange-700"
269
+ >
270
+ TC-LIFE-01: Unload first embedded guest
271
+ </button>
272
+ <p class="text-[10px] text-gray-400 -mt-1">
273
+ Expected: guest iframe removed, "List all guests" count
274
+ decreases
275
+ </p>
276
+ <button
277
+ data-testid="btn-register-close"
278
+ id="btnRegisterClose"
279
+ class="w-full rounded bg-orange-600 px-3 py-1.5 text-xs text-white hover:bg-orange-700"
280
+ >
281
+ TC-LIFE-02: Register onGuestClose
282
+ </button>
283
+ <p class="text-[10px] text-gray-400 -mt-1">
284
+ Expected: log shows callback registered; fires when guest calls
285
+ close()
286
+ </p>
287
+ <button
288
+ data-testid="btn-list-guests"
289
+ id="btnListGuests"
290
+ class="w-full rounded bg-gray-600 px-3 py-1.5 text-xs text-white hover:bg-gray-700"
291
+ >
292
+ List all guests
293
+ </button>
294
+ <p class="text-[10px] text-gray-400 -mt-1">
295
+ Expected: Guest List panel shows all currently loaded guests
296
+ </p>
297
+ <button
298
+ data-testid="btn-set-loglevel"
299
+ id="btnSetLogLevel"
300
+ class="w-full rounded bg-gray-600 px-3 py-1.5 text-xs text-white hover:bg-gray-700"
301
+ >
302
+ Set Log Level (Debug)
303
+ </button>
304
+ <button
305
+ data-testid="btn-close-host"
306
+ id="btnCloseHost"
307
+ class="w-full rounded bg-red-700 px-3 py-1.5 text-xs text-white hover:bg-red-800"
308
+ >
309
+ TC-LIFE-03: Close host
310
+ </button>
311
+ <p class="text-[10px] text-gray-400 -mt-1">
312
+ Expected: all guests unloaded, host destroyed, further actions
313
+ fail
314
+ </p>
315
+ </div>
316
+ </div>
317
+
318
+ <!-- Section: Sandbox Configuration -->
319
+ <div class="bg-white rounded-lg shadow p-3">
320
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
321
+ Sandbox Configuration
322
+ </h2>
323
+ <div class="space-y-2">
324
+ <button
325
+ data-testid="btn-sandbox-default"
326
+ id="btnSandboxDefault"
327
+ class="w-full rounded bg-teal-600 px-3 py-1.5 text-xs text-white hover:bg-teal-700"
328
+ >
329
+ TC-SB-01: Default sandbox
330
+ </button>
331
+ <p class="text-[10px] text-gray-400 -mt-1">
332
+ Expected: iframe has standard sandbox attributes
333
+ </p>
334
+ <button
335
+ data-testid="btn-sandbox-custom"
336
+ id="btnSandboxCustom"
337
+ class="w-full rounded bg-teal-600 px-3 py-1.5 text-xs text-white hover:bg-teal-700"
338
+ >
339
+ TC-SB-02: Custom sandbox values
340
+ </button>
341
+ <p class="text-[10px] text-gray-400 -mt-1">
342
+ Expected: iframe sandbox attribute reflects custom permissions
343
+ </p>
344
+ <button
345
+ data-testid="btn-sandbox-disabled"
346
+ id="btnSandboxDisabled"
347
+ class="w-full rounded bg-teal-600 px-3 py-1.5 text-xs text-white hover:bg-teal-700"
348
+ >
349
+ TC-SB-03: Sandbox disabled
350
+ </button>
351
+ <p class="text-[10px] text-gray-400 -mt-1">
352
+ Expected: iframe has no sandbox attribute (full permissions)
353
+ </p>
354
+ </div>
355
+ </div>
356
+ </div>
357
+
358
+ <!-- Column 2: Guest Containers -->
359
+ <div class="space-y-3">
360
+ <div class="bg-white rounded-lg shadow p-3">
361
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
362
+ Embedded Guests
363
+ </h2>
364
+ <div
365
+ data-testid="embed-container"
366
+ id="embedContainer"
367
+ class="border-2 border-dashed border-indigo-300 rounded min-h-[300px] space-y-2"
368
+ ></div>
369
+ </div>
370
+ <div class="bg-white rounded-lg shadow p-3">
371
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
372
+ Sandbox Test Container
373
+ </h2>
374
+ <div
375
+ data-testid="sandbox-container"
376
+ id="sandboxContainer"
377
+ class="border-2 border-dashed border-teal-300 rounded min-h-[150px] space-y-2"
378
+ ></div>
379
+ </div>
380
+ </div>
381
+
382
+ <!-- Column 3: Results -->
383
+ <div class="space-y-3">
384
+ <div class="bg-white rounded-lg shadow p-3">
385
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
386
+ Event Log
387
+ </h2>
388
+ <div
389
+ data-testid="event-log"
390
+ id="eventLog"
391
+ class="text-xs bg-gray-100 rounded p-2 min-h-[200px] max-h-[350px] overflow-y-auto font-mono"
392
+ ></div>
393
+ <button
394
+ data-testid="btn-clear-log"
395
+ id="btnClearLog"
396
+ class="mt-1 text-xs text-gray-400 hover:text-gray-600"
397
+ >
398
+ Clear
399
+ </button>
400
+ </div>
401
+
402
+ <div class="bg-white rounded-lg shadow p-3">
403
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
404
+ callContext (last invocation)
405
+ </h2>
406
+ <div data-testid="callcontext-panel">
407
+ <h3 class="text-xs text-gray-500">callContext.guest</h3>
408
+ <pre
409
+ data-testid="callcontext-guest"
410
+ id="callContextGuest"
411
+ class="text-xs bg-gray-100 rounded p-1 mb-1 whitespace-pre-wrap min-h-[30px]"
412
+ >
413
+ —</pre
414
+ >
415
+ <h3 class="text-xs text-gray-500">callContext.callChain</h3>
416
+ <pre
417
+ data-testid="callcontext-chain"
418
+ id="callContextChain"
419
+ class="text-xs bg-gray-100 rounded p-1 mb-1 whitespace-pre-wrap min-h-[30px]"
420
+ >
421
+ —</pre
422
+ >
423
+ </div>
424
+ </div>
425
+
426
+ <div class="bg-white rounded-lg shadow p-3">
427
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
428
+ Dispatch Results
429
+ </h2>
430
+ <pre
431
+ data-testid="dispatch-result"
432
+ id="dispatchResult"
433
+ class="text-xs bg-gray-100 rounded p-2 min-h-[60px] whitespace-pre-wrap"
434
+ >
435
+ —</pre
436
+ >
437
+ </div>
438
+
439
+ <div class="bg-white rounded-lg shadow p-3">
440
+ <h2 class="font-semibold text-gray-700 mb-2 border-b pb-1">
441
+ Guest List
442
+ </h2>
443
+ <pre
444
+ data-testid="guest-list"
445
+ id="guestList"
446
+ class="text-xs bg-gray-100 rounded p-2 min-h-[60px] whitespace-pre-wrap"
447
+ >
448
+ —</pre
449
+ >
450
+ </div>
451
+ </div>
452
+ </div>
453
+
454
+ <!-- Verification Checklist -->
455
+ <div class="bg-gray-100 border border-gray-300 rounded-md p-3 mt-4">
456
+ <h2 class="text-sm font-bold text-gray-800 mb-2">
457
+ Verification Checklist
458
+ </h2>
459
+ <div class="grid grid-cols-3 gap-2 text-xs">
460
+ <div>
461
+ <p class="font-semibold text-gray-600 mb-1">Guest Loading</p>
462
+ <label class="flex items-start gap-1"
463
+ ><input type="checkbox" class="mt-0.5" />
464
+ <span
465
+ ><strong>TC-LOAD-01:</strong> Embedded guest loads in
466
+ iframe</span
467
+ ></label
468
+ >
469
+ <label class="flex items-start gap-1"
470
+ ><input type="checkbox" class="mt-0.5" />
471
+ <span
472
+ ><strong>TC-LOAD-02:</strong> Popup guest opens in new
473
+ window</span
474
+ ></label
475
+ >
476
+ <label class="flex items-start gap-1"
477
+ ><input type="checkbox" class="mt-0.5" />
478
+ <span
479
+ ><strong>TC-LOAD-03:</strong> loadGuests loads 3 guests at
480
+ once</span
481
+ ></label
482
+ >
483
+ <label class="flex items-start gap-1"
484
+ ><input type="checkbox" class="mt-0.5" />
485
+ <span
486
+ ><strong>TC-LOAD-04:</strong> searchParams visible in
487
+ guest</span
488
+ ></label
489
+ >
490
+ <label class="flex items-start gap-1"
491
+ ><input type="checkbox" class="mt-0.5" />
492
+ <span
493
+ ><strong>TC-LOAD-05:</strong> Bad URL triggers onError</span
494
+ ></label
495
+ >
496
+ <label class="flex items-start gap-1"
497
+ ><input type="checkbox" class="mt-0.5" />
498
+ <span
499
+ ><strong>TC-META-01:</strong> Metadata appears in
500
+ callChain</span
501
+ ></label
502
+ >
503
+ </div>
504
+ <div>
505
+ <p class="font-semibold text-gray-600 mb-1">
506
+ Scripting Objects & Events
507
+ </p>
508
+ <label class="flex items-start gap-1"
509
+ ><input type="checkbox" class="mt-0.5" />
510
+ <span
511
+ ><strong>TC-SO-01:</strong> Guest can getObject after add</span
512
+ ></label
513
+ >
514
+ <label class="flex items-start gap-1"
515
+ ><input type="checkbox" class="mt-0.5" />
516
+ <span
517
+ ><strong>TC-SO-02:</strong> Guest can't getObject after
518
+ remove</span
519
+ ></label
520
+ >
521
+ <label class="flex items-start gap-1"
522
+ ><input type="checkbox" class="mt-0.5" />
523
+ <span
524
+ ><strong>TC-SO-04:</strong> Scoped object only visible to one
525
+ guest</span
526
+ ></label
527
+ >
528
+ <label class="flex items-start gap-1"
529
+ ><input type="checkbox" class="mt-0.5" />
530
+ <span
531
+ ><strong>TC-EVT-01:</strong> All subscribed guests receive
532
+ event</span
533
+ ></label
534
+ >
535
+ <label class="flex items-start gap-1"
536
+ ><input type="checkbox" class="mt-0.5" />
537
+ <span
538
+ ><strong>TC-EVT-02:</strong> Only targeted guest receives
539
+ event</span
540
+ ></label
541
+ >
542
+ <label class="flex items-start gap-1"
543
+ ><input type="checkbox" class="mt-0.5" />
544
+ <span
545
+ ><strong>TC-EVT-03:</strong> Feedback return value in Dispatch
546
+ Results</span
547
+ ></label
548
+ >
549
+ <label class="flex items-start gap-1"
550
+ ><input type="checkbox" class="mt-0.5" />
551
+ <span
552
+ ><strong>TC-EVT-04:</strong> Criteria filtering works</span
553
+ ></label
554
+ >
555
+ </div>
556
+ <div>
557
+ <p class="font-semibold text-gray-600 mb-1">Lifecycle & Sandbox</p>
558
+ <label class="flex items-start gap-1"
559
+ ><input type="checkbox" class="mt-0.5" />
560
+ <span
561
+ ><strong>TC-LIFE-01:</strong> Unload removes guest iframe</span
562
+ ></label
563
+ >
564
+ <label class="flex items-start gap-1"
565
+ ><input type="checkbox" class="mt-0.5" />
566
+ <span
567
+ ><strong>TC-LIFE-02:</strong> onGuestClose fires on guest
568
+ disconnect</span
569
+ ></label
570
+ >
571
+ <label class="flex items-start gap-1"
572
+ ><input type="checkbox" class="mt-0.5" />
573
+ <span
574
+ ><strong>TC-LIFE-03:</strong> Close host destroys all
575
+ guests</span
576
+ ></label
577
+ >
578
+ <label class="flex items-start gap-1"
579
+ ><input type="checkbox" class="mt-0.5" />
580
+ <span
581
+ ><strong>TC-SB-01:</strong> Default sandbox attrs present</span
582
+ ></label
583
+ >
584
+ <label class="flex items-start gap-1"
585
+ ><input type="checkbox" class="mt-0.5" />
586
+ <span
587
+ ><strong>TC-SB-02:</strong> Custom sandbox attrs applied</span
588
+ ></label
589
+ >
590
+ <label class="flex items-start gap-1"
591
+ ><input type="checkbox" class="mt-0.5" />
592
+ <span
593
+ ><strong>TC-SB-03:</strong> No sandbox attr when disabled</span
594
+ ></label
595
+ >
596
+ </div>
597
+ </div>
598
+ </div>
599
+ </main>
600
+
601
+ <script src="./e2e-host.js" type="module"></script>
602
+ </body>
603
+ </html>