vscode 允许webviews运行服务工作者

a11xaf1n  于 3个月前  发布在  Vscode
关注(0)|答案(4)|浏览(43)

我们的网络扩展希望在HTML文件和内容托管在本地存储而不是托管在线的情况下,允许在VS Code webview中预览HTML文件。目标HTML托管在一个小型 Package 主webview HTML内的iFrame中。
为了实现这个功能,我们希望在我们的webview中提供一个服务工作者来拦截fetch调用,以便我们的扩展可以处理文件请求并从本地存储加载和返回资源。然而,我们无法在VS Code webview中托管的服务工作者上获得成功,无论是在顶级 Package HTML还是尝试在目标托管的HTML中注册它。
在研究服务工作者时,我认为以下几点是正确的:

  1. 服务工作者不能使用数据URL进行注册:Create service worker from Blob/String URL w3c/ServiceWorker#578(我认为这就是如何在vscode webview中工作的web workers)
  2. 服务工作者需要匹配来源:Is it possible to serve service workers from CDN/remote origin? w3c/ServiceWorker#940
    到目前为止,我尝试过的所有事情基本上都在这里:

我创建了一个指向我们服务工作者文件的asWebviewUri(它被添加到可以在localResourceRoots中访问的位置),但由于来源差异,服务工作者无法加载,无论是在这个webview的顶层还是下面的iFrame中。
鉴于我所看到的,我认为我现在无法实现我想要的功能,但如果它可以被启用,对我们的场景将会非常有帮助。

js5cn81o

js5cn81o1#

你是否尝试在webview内部使用iframe,指向你控制的域名?这应该允许服务工作者在iframe内激活。这基本上是我们实现webviews的方法。

bprjcwpo

bprjcwpo2#

你是否尝试在webview中使用一个指向你控制的域名的iframe?这应该允许服务工作者在iframe内激活。这基本上是我们实现webviews的方法。

关于你提到的我控制的域名,我觉得可能遗漏了一些东西。在开始这个项目之前,我对iframe的知识非常有限,所以我可能只是没有理解一些基本的东西。

在我们所面临的情况(可能是离线场景)中,除了vscode-webview://和由webview URIs创建的资源域名之外,没有其他域名可以接收来自其他地方的内容。在我看来,在webview托管的顶级HTML中,我的域名总是会是vscode-webview://。在我托管在下面的iframe中,我可以尝试将src设置为其他内容。但对于我们的场景,我们没有访问外部域名,而是托管了一个本地工作区文件。在这种情况下,我发现这里的src=""实际上并没有解析webview URI。例如:

我在iframe上方放置了一个带有webview uri src的图像,同时还有一个带有webview uri src的webview uri src(这两个文件都存在),虽然图像可以正确解析,但iframe无法解析webview uri src。
因此,我不得不在托管HTML的主webview中加载iframe源,然后将其设置为iframe的srcdoc。现在这是我可能弄错的部分,但是有了srcdoc,我的来源似乎要么是一个特殊的唯一来源,要么如果我在沙箱上指定allow-same-origin,我可以继承相同的vscode-webview://。所以我不知道如何让这个iframe指向不同的域名或者使用哪个域名,因为我们这里只有webview和本地内容可用。
如果以上任何一点我都偏离了方向,请多包涵并感谢你的回复。

wmvff8tz

wmvff8tz3#

可能类似于以下内容:

  1. 在你的webview中添加 <iframe src="https://potentially-unique-subdomain.your-custom-domain.com"></iframe>
  2. 然后在 https://potentially-unique-subdomain.your-custom-domain.com 上,你托管了一个由你的扩展控制的HTML文件和JS脚本。
  3. 这个脚本可以注册一个服务工作者。这个工作者必须来自一个也位于 https://potentially-unique-subdomain.your-custom-domain.com 下运行的脚本。
    此时,iframe的内容现在由服务工作者控制。iframe也能够使用 post message 与其父webview进行通信。
    然后要在iframe内加载自定义html:
  4. 在iframe内部,使用 document.writeI() 与新的html内容一起使用。
  5. 这将替换当前页面的内容,同时保持服务工作者对新内容的活动状态。
    这确实需要在 potentially-unique-subdomain.your-custom-domain.com 上托管内容,但我们也需要为 vscode.dev 做同样的事情。整个方法实际上与VS Code的webviews非常相似。不幸的是,我认为在这个时候,如果没有外部域,你是无法做到这一点的。
yyhrrdl8

yyhrrdl84#

感谢澄清。是的,我猜你可能在建议这个外部域名。目前我们的工具确实是一个在线工具,但我们一直在尝试构建一个可能性,即我们可能会部署在学习环境中(学校/监狱等...),在那里添加更多的域名以连接可能会受到限制。所以很高兴知道,根据你的建议,只要我们愿意自己托管,我们就有一个合理的选择。我们计划在某个时候托管学生内容进行共享,所以我们可能不得不解决这个问题。
还有一个小问题,这种行为是预期的吗?
我在一个带有webview uri src的iframe上方放置了一个图像(两个文件都存在),虽然图像解析正确,但iframe无法解析webview uri src。
对我来说,嵌入在iFrame中的内容无法解析webview URI是有道理的,但我有点惊讶于iFrame元素本身无法解析它,因为我认为该元素与img处于同一级别。

相关问题