插入后将功能策略设置为 iframe

Set feature-policy to iframe after insertion

我在 Firefox 中尝试请求全屏时遇到这个问题。

Request for fullscreen was denied because of FeaturePolicy directives

我试图在页面加载之前使用 setAttribute 函数将 iframe 节点中的 allow 属性从 allow='autoplay; fullscreen' 设置为 javascript 中的 allow='autoplay; fullscreen *',并且它运行良好,但是当我在页面加载后设置它时它不起作用。我看到 DOM 更改了值,但没有效果。我尝试通过将源更改为相同的源来重新加载 iframe,但重新加载后它将变为空白。

test 所示,通过脚本更改 allow= 属性不会更改在 iframe 中起作用的功能策略权限。
这是因为 allow= 属性的权限在 DOM 构建阶段应用。

因此您必须重新加载 iframe 内容才能应用更改后的功能策略权限。
重新加载 iframe 内容完成工作 - 应用新权限。尝试这样做:

iframe = document.getElementById('id_of_frame');
iframe.setAttribute('allow', "autoplay; fullscreen *;");
iframe.src = iframe.src;

请注意 allow="fullscreen" 确实允许与 allow="fullscreen *" 完全相同,这意味着 iframe 中的所有元素都允许具有 full-screen 模式。

这是因为对于 <iframe>fullscreen * 权限转换为 fullscreen 'src' 权限,其中 'src' 表示 iframe 的 URL 的来源=20=]属性。
您可以在上面的测试中观察到这一点,也可以自己检查一下:

// array of allowed origins for 'fullscreen' feature:
var origins = featurePolicy.getAllowlistForFeature('fullscreen');

<iframe src='https://example.com' allow="fullscreen *"> 内部,origins 将是 https://example.com 而不是 *

通配符 * 仅在功能策略 HTTP header 中有意义 - 在 fullscreen * 的情况下,它允许 any[= 内的 full-screen 模式页面上 <iframe src='...'> 的 45=]。