我正在构建一个供个人使用的Safari扩展程序,我的必备条件之一就是能够监视网络请求。
为此,对于常规的XMLHttpRequest猴子补丁,我已经绰绰有余了。在SO中有很多示例,在GitHub中有很多库。我正在使用https://github.com/wendux/Ajax-hook和README中的示例代码。
我创建了一个新的Safari扩展(Safari->开发->显示扩展创建者->新扩展),创建了一个新的空字段,并复制了库和演示代码的缩小版本。然后,将扩展名的访问权限设置为“全部”,将刚刚创建的.js文件添加到“初始脚本”部分,并加载扩展名。
我希望我打开的选项卡的请求可以触发演示代码中的console.log
,但它们不会触发任何事情。
如果我从扩展程序中按原样复制并粘贴代码,并将其粘贴到Safari的开发控制台中,然后尝试通过ajax加载某些内容,则会显示console.log
。这使我认为Safari扩展可以使用原型覆盖的内容存在某种限制。也许还有其他一些我不知道的限制。
我想念什么?为什么XMLHttpRequest原型重写不起作用?
我的代码如下:
if (window.top === window) {
window.onload = function() {
// https://github.com/wendux/Ajax-hook
<-- here goes the minified version of the lib -->
hookAjax({
//hook callbacks
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
},
onload:function(xhr){
console.log("onload called: %O",xhr)
},
//hook function
open:function(arg,xhr){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
}
});
}
}