Сценарий с расширением Chrome - добавьте JavaScript перед кодом страницы - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать расширение Chrome со скриптом содержимого, чтобы вставить скрипт в веб-страницу перед всеми остальными скриптами на странице . (Я использую библиотеку xhook для перехвата запросов XHR, которая перезаписывает класс XHR. Мне нужно сделать это, потому что в настоящее время невозможно изменить ответы с помощью API расширений Chrome .) Событие document_start выполняется до того, как будет написана какая-либо из DOM, поэтому я вручную создаю элемент body с помощью скрипта содержимого. Тем не менее, это создает 2 тега body в HTML, что делает переменные, определенные в теге введенного скрипта, недоступными для кода на главной странице.

Как мне это сделать?

У меня есть упрощенная версия моего кода ниже:

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 голосов
/ 28 июня 2019

Если расширение загружено в document_start, document.head = null.Следовательно, чтобы преодолеть это, сделайте - document.lastChild.appendChild(script_tag);.Это создаст тег скрипта в вашей иерархии <html>.Надеюсь, это поможет.

Кроме того, не могли бы вы сказать, почему вы делаете следующее заявление document.body = document.createElement("body"); Я считаю, что это не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...