我正试图从动态创建的iframe注册一个服务工作者,如下所示:
var iframe = document.createElement('iframe');
var html = '
<head><script src="/script.js"></script></head>
<body>Iframe</body>
';
document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();
script.js
包含注册服务工作者的代码(来自谷歌文档的texbook示例(。
这会抛出一个错误,称为"Failed to register a ServiceWorker: The document is in an invalid state."
我尝试在iframe的"load"事件处理程序中包含服务工作者注册代码,并添加超时以说明可能在错误时间调用服务工作者注册码,但没有成功。
在Chromium的源代码中,我发现了以下代码,我认为这就是错误的来源:
if (!m_provider) {
resolver->reject(DOMException::create(InvalidStateError, "Failed to register a ServiceWorker: The document is in an invalid state."));
return promise;
}
什么是";该文档处于无效状态";在这种情况下是什么意思?什么是m_provider
?为什么它不可用?
这似乎是由Chromium中的一个错误引起的:https://bugs.chromium.org/p/chromium/issues/detail?id=1102209
理想情况下,动态创建的框架将继承在父级上注册的服务工作者,从而完全不需要在iframe的contentWindow中进行写入。