Skip to main content

HOST_RUNTIME

Constant HOST_RUNTIME 

Source
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.