Chrome扩展程序内容脚本-在页面代码之前插入Javascript

时间:2019-03-19 15:47:30

标签: javascript html google-chrome-extension xmlhttprequest

我正在尝试使用内容脚本制作一个Chrome扩展程序,以将脚本插入网页,然后将该脚本插入页面中的所有其他脚本。 (我正在使用xhook库来拦截XHR请求,该请求将覆盖XHR类。因为当前它是impossible to modify responses using Chrome extension APIs,所以我需要这样做。)“ document_start”事件在任何DOM之前执行是写的,所以我用内容脚本手动创建了body元素。但是,这会在HTML中创建2个body标签,这似乎使注入的脚本标签中定义的变量无法访问主页中的代码。

我应该怎么做?

我在下面简化了我的代码:

manifest.json

{
    // Required
    "manifest_version": 2,
    "name": "My Extension",
    "version": "0.1",
    "description": "My Description",
    "author": "Me",
    "permissions": ["https://example.com/*"],
    "content_scripts": [{
            "matches": ["https://example.com/*"],
            "js": ["xhook.js"],
            "run_at": "document_start",
            "all_frames": true
        }
    ]
}

xhook.js

var script_tag = document.createElement('script');
script_tag.type = 'text/javascript';
holder = document.createTextNode(`

//Xhook library code
// XHook - v1.4.9 - https://github.com/jpillora/xhook
//...

//Now to use the library
console.log('loading extension');
xhook.after(function (request, response) {
    //console.log(request.url);
    if (request.url.startsWith("https://example.com/")) {
        var urlParams = new URLSearchParams(window.location.search);
        fetch('https://example.com/robots.txt')
        .then(
            function (apiresponse) {
            if (apiresponse.status == 200) {
                response.text = apiresponse.text();
                return;
            };
            if (apiresponse.status !== 200) {
                console.log('File not found. Status Code: ' +
                    apiresponse.status);
                return;
            };
        });
    };
});
xhook.enable();`);
script_tag.appendChild(holder);
document.body = document.createElement("body");
document.head.appendChild(script_tag);

谢谢!

1 个答案:

答案 0 :(得分:0)

如果扩展名为document_start,则加载document.head = null。因此,要克服此问题,请执行-document.lastChild.appendChild(script_tag);。这将在您的<html>层次结构中创建一个脚本标记。希望这会有所帮助。

也请您说出为什么要执行以下语句     document.body = document.createElement("body");我相信这不是必需的。