pub const HOST_RUNTIME: &str = "// One document per persistent context. The parent only routes requests.\n(() => {\n const contexts = new Map();\n const child = `<!doctype html><meta charset=\"utf-8\"><script>\n addEventListener(\'message\', async event => {\n if (event.source !== parent) return;\n const {id, source} = event.data;\n try {\n const value = await (0, eval)(source);\n parent.postMessage(JSON.stringify({id, value: value === undefined ? null : value}), \'*\');\n } catch (error) {\n parent.postMessage(JSON.stringify({id, error: String(error)}), \'*\');\n }\n });<\\/script>`;\n addEventListener(\'message\', event => {\n if ([...contexts.values()].some(c => c.frame.contentWindow === event.source)) bernScriptComplete(event.data);\n });\n globalThis.bernScriptDispatch = requests => {\n for (const request of requests) {\n if (request.source === null) {\n contexts.get(request.context)?.frame.remove(); contexts.delete(request.context); continue;\n }\n let context = contexts.get(request.context);\n if (!context) {\n const frame = document.createElement(\'iframe\');\n frame.hidden = true; frame.sandbox = \'allow-scripts\';\n context = {frame, ready: false, queue: []};\n frame.onload = () => { context.ready = true; for (const r of context.queue) frame.contentWindow.postMessage(r, \'*\'); context.queue = []; };\n frame.srcdoc = child; document.body.append(frame); contexts.set(request.context, context);\n }\n if (context.ready) context.frame.contentWindow.postMessage(request, \'*\');\n else context.queue.push(request);\n }\n };\n})();\n";Expand description
HTML runtime shared by native WebView adapters.