@elliemae/ssf-host 2.23.6 → 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.
- package/dist/cjs/callchain-host.html +262 -0
- package/dist/cjs/callchain-intermediate.html +92 -0
- package/dist/cjs/e2e-host.html +603 -0
- package/dist/cjs/e2e-index.html +234 -0
- package/dist/cjs/host.js +93 -36
- package/dist/cjs/index.html +304 -151
- package/dist/cjs/popup-focus-host.html +318 -0
- package/dist/cjs/utils.js +14 -1
- package/dist/cjs/v2-host-v1-guest.html +3 -0
- package/dist/esm/callchain-host.html +262 -0
- package/dist/esm/callchain-intermediate.html +92 -0
- package/dist/esm/e2e-host.html +603 -0
- package/dist/esm/e2e-index.html +234 -0
- package/dist/esm/host.js +94 -37
- package/dist/esm/index.html +304 -151
- package/dist/esm/popup-focus-host.html +318 -0
- package/dist/esm/utils.js +14 -1
- package/dist/esm/v2-host-v1-guest.html +3 -0
- package/dist/public/callchain-host.html +34 -0
- package/dist/public/callchain-host.js +3 -0
- package/dist/public/callchain-host.js.br +0 -0
- package/dist/public/callchain-host.js.gz +0 -0
- package/dist/public/callchain-host.js.map +1 -0
- package/dist/public/callchain-intermediate.html +1 -0
- package/dist/public/e2e-host.html +5 -0
- package/dist/public/e2e-host.js +8 -0
- package/dist/public/e2e-host.js.br +0 -0
- package/dist/public/e2e-host.js.gz +0 -0
- package/dist/public/e2e-host.js.map +1 -0
- package/dist/public/e2e-index.html +1 -0
- package/dist/public/index.html +1 -1
- package/dist/public/init.js +1 -1
- package/dist/public/init.js.br +0 -0
- package/dist/public/init.js.gz +0 -0
- package/dist/public/init.js.map +1 -1
- package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js +3 -0
- package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.br +0 -0
- package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.gz +0 -0
- package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.map +1 -0
- package/dist/public/loan-object.js +1 -1
- package/dist/public/loan-object.js.br +0 -0
- package/dist/public/loan-object.js.gz +0 -0
- package/dist/public/loan-object.js.map +1 -1
- package/dist/public/popup-focus-host.html +1 -0
- package/dist/public/popup-focus-host.js +6 -0
- package/dist/public/popup-focus-host.js.br +0 -0
- package/dist/public/popup-focus-host.js.gz +0 -0
- package/dist/public/popup-focus-host.js.map +1 -0
- package/dist/public/v1-guest-v2-host.html +1 -1
- package/dist/public/v2-host-v1-guest.html +1 -1
- package/dist/types/lib/host.d.ts +1 -0
- package/dist/types/lib/ihost.d.ts +15 -0
- package/dist/types/lib/tests/timingDedup.test.d.ts +1 -0
- package/dist/types/lib/utils.d.ts +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/umd/callchain-host.html +34 -0
- package/dist/umd/callchain-host.js +3 -0
- package/dist/umd/callchain-host.js.br +0 -0
- package/dist/umd/callchain-host.js.gz +0 -0
- package/dist/umd/callchain-host.js.map +1 -0
- package/dist/umd/callchain-intermediate.html +1 -0
- package/dist/umd/e2e-host.html +5 -0
- package/dist/umd/e2e-host.js +8 -0
- package/dist/umd/e2e-host.js.br +0 -0
- package/dist/umd/e2e-host.js.gz +0 -0
- package/dist/umd/e2e-host.js.map +1 -0
- package/dist/umd/e2e-index.html +1 -0
- package/dist/umd/index.html +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.br +0 -0
- package/dist/umd/index.js.gz +0 -0
- package/dist/umd/index.js.map +1 -1
- package/dist/umd/init.js +1 -1
- package/dist/umd/init.js.br +0 -0
- package/dist/umd/init.js.gz +0 -0
- package/dist/umd/init.js.map +1 -1
- package/dist/umd/loan-object.js +1 -1
- package/dist/umd/loan-object.js.br +0 -0
- package/dist/umd/loan-object.js.gz +0 -0
- package/dist/umd/loan-object.js.map +1 -1
- package/dist/umd/popup-focus-host.html +1 -0
- package/dist/umd/popup-focus-host.js +6 -0
- package/dist/umd/popup-focus-host.js.br +0 -0
- package/dist/umd/popup-focus-host.js.gz +0 -0
- package/dist/umd/popup-focus-host.js.map +1 -0
- package/dist/umd/v2-host-v1-guest.html +1 -1
- package/package.json +5 -5
- package/dist/public/js/emuiSsfHost.5855ec3cd0fa60013d84.js +0 -3
- package/dist/public/js/emuiSsfHost.5855ec3cd0fa60013d84.js.br +0 -0
- package/dist/public/js/emuiSsfHost.5855ec3cd0fa60013d84.js.gz +0 -0
- package/dist/public/js/emuiSsfHost.5855ec3cd0fa60013d84.js.map +0 -1
|
@@ -0,0 +1,262 @@
|
|
|
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>CallChain E2E Test - Root Host</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">
|
|
11
|
+
<header
|
|
12
|
+
class="bg-indigo-600 text-white px-4 py-3 flex items-center justify-between"
|
|
13
|
+
>
|
|
14
|
+
<h1 class="text-lg font-semibold">CallChain E2E Test — Root Host (A)</h1>
|
|
15
|
+
<a href="./index.html" class="text-indigo-200 hover:text-white text-sm"
|
|
16
|
+
>← Back to main</a
|
|
17
|
+
>
|
|
18
|
+
</header>
|
|
19
|
+
|
|
20
|
+
<main class="mx-auto max-w-7xl px-4 py-4">
|
|
21
|
+
<!-- Architecture + Instructions -->
|
|
22
|
+
<div class="grid grid-cols-2 gap-4 mb-4">
|
|
23
|
+
<div class="bg-blue-50 border border-blue-200 rounded-md p-3">
|
|
24
|
+
<h2 class="text-sm font-bold text-blue-900 mb-2">Architecture</h2>
|
|
25
|
+
<pre class="text-xs text-blue-800 leading-relaxed">
|
|
26
|
+
Root Host (A) [localhost:4000]
|
|
27
|
+
├─ Exposes: <strong>TestService</strong> scripting object
|
|
28
|
+
├─ Loads guest <strong>"intermediateHost"</strong>
|
|
29
|
+
│ metadata: { vendor: "Acme Credit Corp", tier: "premium" }
|
|
30
|
+
│
|
|
31
|
+
└─ Intermediate (B) [localhost:4000, same-origin iframe]
|
|
32
|
+
├─ Connects as V2 guest to A
|
|
33
|
+
├─ Loads ice.guest from localhost:4001/index.js
|
|
34
|
+
├─ Gets TestService proxy, clones it
|
|
35
|
+
├─ Creates own SSFHost, loads guest <strong>"grandchildGuest"</strong>
|
|
36
|
+
│ metadata: { role: "validator", region: "US-East" }
|
|
37
|
+
│
|
|
38
|
+
└─ Grandchild (C) [localhost:4001, cross-origin iframe]
|
|
39
|
+
└─ Connects as V2 guest to B
|
|
40
|
+
└─ Gets TestService proxy → calls methods</pre
|
|
41
|
+
>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="bg-green-50 border border-green-200 rounded-md p-3">
|
|
45
|
+
<h2 class="text-sm font-bold text-green-900 mb-2">Test Steps</h2>
|
|
46
|
+
<ol class="text-xs text-green-800 space-y-2 list-decimal list-inside">
|
|
47
|
+
<li>
|
|
48
|
+
<strong>Wait for initialization</strong> — check the Invocation
|
|
49
|
+
Log shows: <code>"Root Host (A) ready"</code>, Intermediate shows
|
|
50
|
+
<code>"Intermediate (B) ready"</code>, Grandchild shows
|
|
51
|
+
<code>"Got TestService proxy"</code>.
|
|
52
|
+
</li>
|
|
53
|
+
<li>
|
|
54
|
+
<strong>Click any button</strong> inside the Grandchild (C) panel
|
|
55
|
+
(e.g. "Call getCallerInfo()").
|
|
56
|
+
</li>
|
|
57
|
+
<li>
|
|
58
|
+
<strong>Verify on the left</strong> — the "callContext.guest" and
|
|
59
|
+
"callContext.callChain" panels update with the expected values
|
|
60
|
+
shown below.
|
|
61
|
+
</li>
|
|
62
|
+
<li>
|
|
63
|
+
<strong>Verify on grandchild</strong> — the return value appears
|
|
64
|
+
in the grandchild's result area (proves round-trip works).
|
|
65
|
+
</li>
|
|
66
|
+
</ol>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<!-- Expected Values -->
|
|
71
|
+
<div class="bg-amber-50 border border-amber-200 rounded-md p-3 mb-4">
|
|
72
|
+
<h2 class="text-sm font-bold text-amber-900 mb-2">
|
|
73
|
+
Expected Values (when grandchild C calls any method)
|
|
74
|
+
</h2>
|
|
75
|
+
<div class="grid grid-cols-2 gap-4 text-xs">
|
|
76
|
+
<div>
|
|
77
|
+
<h3 class="font-semibold text-amber-800 mb-1">
|
|
78
|
+
callContext.guest (direct caller = B)
|
|
79
|
+
</h3>
|
|
80
|
+
<pre
|
|
81
|
+
data-testid="expected-guest"
|
|
82
|
+
class="bg-white rounded p-2 text-amber-900"
|
|
83
|
+
>
|
|
84
|
+
{
|
|
85
|
+
"id": "intermediateHost",
|
|
86
|
+
"title": "Intermediate Guest+Host (B)",
|
|
87
|
+
"url": "...callchain-intermediate.html"
|
|
88
|
+
}</pre
|
|
89
|
+
>
|
|
90
|
+
</div>
|
|
91
|
+
<div>
|
|
92
|
+
<h3 class="font-semibold text-amber-800 mb-1">
|
|
93
|
+
callContext.callChain (originator chain)
|
|
94
|
+
</h3>
|
|
95
|
+
<pre
|
|
96
|
+
data-testid="expected-callchain"
|
|
97
|
+
class="bg-white rounded p-2 text-amber-900"
|
|
98
|
+
>
|
|
99
|
+
[
|
|
100
|
+
{
|
|
101
|
+
"id": "grandchildGuest",
|
|
102
|
+
"metadata": { "role": "validator", "region": "US-East" }
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "intermediateHost",
|
|
106
|
+
"metadata": { "vendor": "Acme Credit Corp", "tier": "premium" }
|
|
107
|
+
}
|
|
108
|
+
]</pre
|
|
109
|
+
>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="grid grid-cols-2 gap-4">
|
|
115
|
+
<!-- Left: callContext results -->
|
|
116
|
+
<div>
|
|
117
|
+
<h2 class="text-md font-semibold mb-2">
|
|
118
|
+
Actual Results (from Root Host A)
|
|
119
|
+
</h2>
|
|
120
|
+
|
|
121
|
+
<div
|
|
122
|
+
data-testid="direct-caller-panel"
|
|
123
|
+
class="bg-white rounded-lg shadow p-3 mb-3"
|
|
124
|
+
>
|
|
125
|
+
<h3 class="text-sm font-medium text-gray-500 mb-1">
|
|
126
|
+
callContext.guest (direct caller)
|
|
127
|
+
</h3>
|
|
128
|
+
<pre
|
|
129
|
+
data-testid="direct-caller-result"
|
|
130
|
+
id="directCallerResult"
|
|
131
|
+
class="text-xs bg-gray-100 rounded p-2 min-h-[40px] whitespace-pre-wrap"
|
|
132
|
+
>
|
|
133
|
+
Waiting — click a button in Grandchild (C)...</pre
|
|
134
|
+
>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div
|
|
138
|
+
data-testid="callchain-panel"
|
|
139
|
+
class="bg-white rounded-lg shadow p-3 mb-3"
|
|
140
|
+
>
|
|
141
|
+
<h3 class="text-sm font-medium text-gray-500 mb-1">
|
|
142
|
+
callContext.callChain (original callers)
|
|
143
|
+
</h3>
|
|
144
|
+
<pre
|
|
145
|
+
data-testid="callchain-result"
|
|
146
|
+
id="callChainResult"
|
|
147
|
+
class="text-xs bg-gray-100 rounded p-2 min-h-[60px] whitespace-pre-wrap"
|
|
148
|
+
>
|
|
149
|
+
Waiting — click a button in Grandchild (C)...</pre
|
|
150
|
+
>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<div
|
|
154
|
+
data-testid="method-result-panel"
|
|
155
|
+
class="bg-white rounded-lg shadow p-3 mb-3"
|
|
156
|
+
>
|
|
157
|
+
<h3 class="text-sm font-medium text-gray-500 mb-1">
|
|
158
|
+
Method return value (returned to grandchild)
|
|
159
|
+
</h3>
|
|
160
|
+
<pre
|
|
161
|
+
data-testid="method-return-result"
|
|
162
|
+
id="methodReturnResult"
|
|
163
|
+
class="text-xs bg-gray-100 rounded p-2 min-h-[40px] whitespace-pre-wrap"
|
|
164
|
+
>
|
|
165
|
+
Waiting — click a button in Grandchild (C)...</pre
|
|
166
|
+
>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
<div
|
|
170
|
+
data-testid="invocation-log-panel"
|
|
171
|
+
class="bg-white rounded-lg shadow p-3"
|
|
172
|
+
>
|
|
173
|
+
<h3 class="text-sm font-medium text-gray-500 mb-1">
|
|
174
|
+
Invocation Log
|
|
175
|
+
</h3>
|
|
176
|
+
<div
|
|
177
|
+
data-testid="invocation-log"
|
|
178
|
+
id="invocationLog"
|
|
179
|
+
class="text-xs bg-gray-100 rounded p-2 min-h-[80px] max-h-[200px] overflow-y-auto"
|
|
180
|
+
></div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<!-- Right: guest container -->
|
|
185
|
+
<div>
|
|
186
|
+
<h2 class="text-md font-semibold mb-2">
|
|
187
|
+
Intermediate Guest (B) → Grandchild Guest (C)
|
|
188
|
+
</h2>
|
|
189
|
+
<div
|
|
190
|
+
data-testid="intermediate-guest-container"
|
|
191
|
+
id="intermediate-container"
|
|
192
|
+
class="border-2 border-dashed border-indigo-300 rounded-lg h-[400px]"
|
|
193
|
+
></div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<!-- Verification Checklist -->
|
|
198
|
+
<div class="bg-gray-100 border border-gray-300 rounded-md p-3 mt-4">
|
|
199
|
+
<h2 class="text-sm font-bold text-gray-800 mb-2">
|
|
200
|
+
Verification Checklist
|
|
201
|
+
</h2>
|
|
202
|
+
<div class="grid grid-cols-2 gap-2 text-xs">
|
|
203
|
+
<label class="flex items-start gap-2">
|
|
204
|
+
<input type="checkbox" class="mt-0.5" />
|
|
205
|
+
<span
|
|
206
|
+
><strong>TC-CC-01:</strong> All three layers initialized without
|
|
207
|
+
errors (Log shows "ready" messages, no ERROR lines)</span
|
|
208
|
+
>
|
|
209
|
+
</label>
|
|
210
|
+
<label class="flex items-start gap-2">
|
|
211
|
+
<input type="checkbox" class="mt-0.5" />
|
|
212
|
+
<span
|
|
213
|
+
><strong>TC-CC-02:</strong> <code>callContext.guest.id</code> =
|
|
214
|
+
<code>"intermediateHost"</code> (B is the direct caller, not
|
|
215
|
+
C)</span
|
|
216
|
+
>
|
|
217
|
+
</label>
|
|
218
|
+
<label class="flex items-start gap-2">
|
|
219
|
+
<input type="checkbox" class="mt-0.5" />
|
|
220
|
+
<span
|
|
221
|
+
><strong>TC-CC-03:</strong> <code>callChain[0].id</code> =
|
|
222
|
+
<code>"grandchildGuest"</code> with metadata
|
|
223
|
+
<code>{ role, region }</code></span
|
|
224
|
+
>
|
|
225
|
+
</label>
|
|
226
|
+
<label class="flex items-start gap-2">
|
|
227
|
+
<input type="checkbox" class="mt-0.5" />
|
|
228
|
+
<span
|
|
229
|
+
><strong>TC-CC-04:</strong> <code>callChain[1].id</code> =
|
|
230
|
+
<code>"intermediateHost"</code> with metadata
|
|
231
|
+
<code>{ vendor, tier }</code></span
|
|
232
|
+
>
|
|
233
|
+
</label>
|
|
234
|
+
<label class="flex items-start gap-2">
|
|
235
|
+
<input type="checkbox" class="mt-0.5" />
|
|
236
|
+
<span
|
|
237
|
+
><strong>TC-CC-05:</strong> Grandchild (C) receives the method
|
|
238
|
+
return value (result appears in C's panel)</span
|
|
239
|
+
>
|
|
240
|
+
</label>
|
|
241
|
+
<label class="flex items-start gap-2">
|
|
242
|
+
<input type="checkbox" class="mt-0.5" />
|
|
243
|
+
<span
|
|
244
|
+
><strong>TC-CC-06:</strong> All three methods work:
|
|
245
|
+
<code>getCallerInfo()</code>, <code>ping()</code>,
|
|
246
|
+
<code>getLoanDetails()</code></span
|
|
247
|
+
>
|
|
248
|
+
</label>
|
|
249
|
+
<label class="flex items-start gap-2">
|
|
250
|
+
<input type="checkbox" class="mt-0.5" />
|
|
251
|
+
<span
|
|
252
|
+
><strong>TC-CC-07:</strong> No cross-origin or console errors
|
|
253
|
+
during invocations</span
|
|
254
|
+
>
|
|
255
|
+
</label>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
</main>
|
|
259
|
+
|
|
260
|
+
<script src="./callchain-host.js" type="module"></script>
|
|
261
|
+
</body>
|
|
262
|
+
</html>
|
|
@@ -0,0 +1,92 @@
|
|
|
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>Intermediate Guest+Host (B)</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
|
+
<script src="http://localhost:4001/index.js"></script>
|
|
10
|
+
</head>
|
|
11
|
+
<body class="bg-orange-50 p-2">
|
|
12
|
+
<h2 class="text-sm font-semibold text-orange-800 mb-1">
|
|
13
|
+
Intermediate (B) — Guest + Host
|
|
14
|
+
</h2>
|
|
15
|
+
|
|
16
|
+
<div
|
|
17
|
+
data-testid="intermediate-status"
|
|
18
|
+
id="status"
|
|
19
|
+
class="text-xs bg-orange-100 rounded p-2 mb-2 min-h-[30px]"
|
|
20
|
+
>
|
|
21
|
+
Initializing...
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div
|
|
25
|
+
data-testid="grandchild-container"
|
|
26
|
+
id="grandchild-container"
|
|
27
|
+
class="border border-dashed border-orange-400 rounded h-[250px]"
|
|
28
|
+
></div>
|
|
29
|
+
|
|
30
|
+
<script type="module">
|
|
31
|
+
import { Analytics } from './analytics-object-v2.js';
|
|
32
|
+
import { getGuestBaseUrl, getHost } from './utils.js';
|
|
33
|
+
|
|
34
|
+
const statusEl = document.getElementById('status');
|
|
35
|
+
const log = (msg) => {
|
|
36
|
+
const ts = new Date().toLocaleTimeString();
|
|
37
|
+
statusEl.innerHTML += `<div>[${ts}] ${msg}</div>`;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
(async () => {
|
|
41
|
+
try {
|
|
42
|
+
// Step 1: Connect to parent host (A) as V2 guest
|
|
43
|
+
log('Connecting to Root Host (A) as V2 guest...');
|
|
44
|
+
const guestV2 = new ice.guest.SSFGuest({
|
|
45
|
+
logger: {
|
|
46
|
+
index: 'intermediate-guest',
|
|
47
|
+
team: 'ui platform',
|
|
48
|
+
appName: 'intermediate-b',
|
|
49
|
+
},
|
|
50
|
+
keepAlive: false,
|
|
51
|
+
});
|
|
52
|
+
await guestV2.connect();
|
|
53
|
+
log('Connected to Root Host (A)');
|
|
54
|
+
|
|
55
|
+
// Step 2: Get TestService from parent
|
|
56
|
+
const testService = await guestV2.getObject('TestService');
|
|
57
|
+
log('Got TestService proxy from Root Host (A)');
|
|
58
|
+
|
|
59
|
+
// Step 3: Create own V2 host
|
|
60
|
+
const analyticsObj = new Analytics();
|
|
61
|
+
const hostB = getHost(analyticsObj);
|
|
62
|
+
if (!hostB) {
|
|
63
|
+
log('ERROR: Failed to create intermediate SSFHost');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
log('Created intermediate SSFHost (B)');
|
|
67
|
+
|
|
68
|
+
// Step 4: Clone TestService for grandchild
|
|
69
|
+
const clonedTestService = hostB.cloneScriptingObject(testService);
|
|
70
|
+
hostB.addScriptingObject(clonedTestService);
|
|
71
|
+
log('Cloned TestService for grandchild guests');
|
|
72
|
+
|
|
73
|
+
// Step 5: Load grandchild guest (C) with metadata
|
|
74
|
+
const guestBaseUrl = await getGuestBaseUrl();
|
|
75
|
+
hostB.loadGuest({
|
|
76
|
+
id: 'grandchildGuest',
|
|
77
|
+
url: new URL('./callchain-grandchild.html', guestBaseUrl).href,
|
|
78
|
+
title: 'Grandchild Guest (C)',
|
|
79
|
+
targetElement: document.getElementById('grandchild-container'),
|
|
80
|
+
metadata: { role: 'validator', region: 'US-East' },
|
|
81
|
+
onLoad: () => log('Grandchild guest (C) loaded'),
|
|
82
|
+
onError: () => log('ERROR: Grandchild guest (C) failed to load'),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
log('Intermediate (B) ready');
|
|
86
|
+
} catch (err) {
|
|
87
|
+
log(`ERROR: ${err.message}`);
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
</script>
|
|
91
|
+
</body>
|
|
92
|
+
</html>
|