Javascript 为什么这个代码不起作用?我正在创建Firefox扩展,但代码没有运行。但是如果我将代码粘贴到控制台中,它就可以工作了

Javascript 为什么这个代码不起作用?我正在创建Firefox扩展,但代码没有运行。但是如果我将代码粘贴到控制台中,它就可以工作了,javascript,firefox,xmlhttprequest,firefox-addon,firefox-addon-webextensions,Javascript,Firefox,Xmlhttprequest,Firefox Addon,Firefox Addon Webextensions,我制作了一个firefox扩展,它获取所有请求url并显示它们。但是,只有在我将代码粘贴到控制台中时,代码才起作用 当扩展加载时,它没有显示任何错误,看起来它就是不运行 这是完整的代码 xhrScript.js (function(){ const proxiedOpen = XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function ( _, url) { thi

我制作了一个firefox扩展,它获取所有请求url并显示它们。但是,只有在我将代码粘贴到控制台中时,代码才起作用

当扩展加载时,它没有显示任何错误,看起来它就是不运行

这是完整的代码

xhrScript.js

(function(){

    const proxiedOpen = XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function ( _, url) {
        this.__URL = url;
        return proxiedOpen.apply(this, arguments);
    };

    const proxiedSend = window.XMLHttpRequest.prototype.send;
    window.XMLHttpRequest.prototype.send = function () {
        const { protocol, host } = window.location;
        // showing only when it paste in console
        console.log("full request url ", `${protocol}//${host}${this.__URL}`);
        return proxiedSend.apply(this, [].slice.call(arguments));
    };

})();

// this works all times
document.body.style.border = "7px solid blue";
manifest.json

{
    "manifest_version": 2,
    "name": "XHR request urls",
    "version": "1.0",
    "description": "get all the request url's",

    "content_scripts": [
      {
        "matches": ["*://*/*"],
        "js": ["xhrScript.js"]
      }
    ]  
}
如您所见,最后一行是
document.body.style.border=“7px纯蓝色”,每次都可以正常工作。但是XMLHttpRequest
open
send
方法不起作用。仅当我将代码粘贴到控制台中时才起作用

如果您想查看示例,可以尝试在devTools控制台中复制并粘贴
xhrScript.js
代码(这是一个SPA,因此很容易检查我想要的内容),并查看所有请求


我不知道为什么这段代码只有在粘贴到控制台时才会运行,因为内容脚本在一个隔离的JavaScript环境中运行,这意味着
窗口及其内容与页面隔离,所以当您修改它时,您只能修改内容脚本的版本

有两种解决方案:

  • 特定于Firefox

    使用
    wrappedJSObject
    exportFunction
    访问页面上下文():

    consturl=newweakmap();
    const origXhr=hookPagePrototype('XMLHttpRequest'{
    打开(方法、url){
    设置(这个,url);
    返回origXhr.open.apply(这是参数);
    },
    发送(){
    console.log('Sending',新URL(URL.get(this),location.href);
    返回origXhr.send.apply(这是参数);
    },
    });
    函数hookPagePrototype(原名,funcs){
    const proto=wrappedJSObject[protoName]。原型;
    const oldFuncs={};
    for(Object.entries(funcs))的常量[name,fn]{
    oldFuncs[name]=exportFunction(proto[name],wrappedJSObject);
    proto[name]=exportFunction(fn,wrappedJSObject);
    }
    返回oldFuncs;
    }
    
  • 铬兼容

    使用DOM脚本在页面上下文中运行代码:。

    它在受严格内容安全策略(CSP)保护的页面上不起作用,CSP会阻止脚本执行,因此在为Firefox编写扩展时,我们应该使用
    wrappedJSObject
    方法


  • 哇,它很管用,我对制作浏览器扩展真的很陌生。这对我帮助很大,谢谢分享文档