【发布时间】:2014-01-14 11:40:25
【问题描述】:
我正在使用 Google Chrome 扩展程序进行开发。在这种环境下,我可以在请求适当的权限后将 JavaScript 注入第三方网站。因此,我将代码注入到引用跨域资源的 iframe 中,但不受“正常”环境中预期的相同跨域安全策略的约束。
我在这个 iframe 中执行的代码是:
var requestId = window.requestAnimationFrame(function(){
console.log("Success");
});
console.log("Request Id:", requestId);
这段代码执行后,我的输出如下:
请求 ID:1
requestAnimationFrame 的回调永远不会被执行。 requestAnimationFrame 已定义。如果我使用 setInterval 等非优化调用,回调可以正常工作。
回调在 iframe 之外正确执行,但当它在 iframe 内失败时,我的控制台中不会显示任何安全错误。这仅适用于最新版本的 Google Chrome —— 不要担心 requestAnimationFrame 的其他实现。
我可以采取任何步骤来调试此问题吗? window.requestAnimationFrame 进入本机代码,我的 requestId 是有效的......所以我有点茫然。
编辑:
以下是将问题重现为小型 Google Chrome 扩展程序的完整源代码:https://gist.github.com/MeoMix/37b4dbdbb3bd48f3c9e2
这是上述源代码的可下载 zip:https://mega.co.nz/#!2BFA1agY!JSZC1BFBza3rU4LnqlZqcR9neZQRJn0yh1U6tu2GWo4
【问题讨论】:
-
您能否提供有效的代码和页面来重现该问题?页面是否覆盖了 RAF?例如。
window.requestAnimationFrame=function(){return 1;};? -
我 console.log'ed window.requestAnimationFrame 并且控制台指示该函数的主体是本机代码。我假设这意味着它没有被存根。今晚我将制作一个工作示例并更新我的帖子——抱歉缺乏可靠的信息。如果有任何帮助 - 我将代码注入到 YouTube API 生成的 iframe 中。
-
这不太可能,但并非不可能。而“[native code]”并不能告诉你太多。
window.requestAnimationFrame = (function(){return 1;}).bind(null);会显示相同的行为,并且还会显示“[native code]”。 -
有趣,TIL。本机代码实际上表明了什么?我以为它正在我的 GPU 上或者什么时候可以再次渲染。
-
“原生代码并不能告诉你太多”,我的意思是任何人都可以创建一个序列化为“function() { [native code] }` 的函数。如果你看到”[native code ]”,只是将其读作“无法序列化函数的源代码”。
标签: javascript iframe google-chrome-extension cross-domain