Нужна помощь в вводе сценария в заголовок страницы, прежде чем DOM будет выполнен в расширении chrome

#google-chrome #dom #google-chrome-extension #content-script #manifest.json

Вопрос:

Мы работаем над расширением Chrome с открытым исходным кодом: Клиент цифрового помощника

Я пытался внедрить сценарий на веб-страницу с расширением chrome до того, как страница начнет загружать dom, используя «сценарий содержимого» и «run_at»: document_start. Но похоже, что страница dom загружается до того, как вводится мой скрипт. Я делаю это в манифесте версии 2.

В manifest.json я заявил следующее

 {
  "matches": ["*://*"],
  "js": ["js/injectscriptmodifier.js"],
  "all_frames": false,
  "run_at":"document_start"
},
 

The Injectscriptmodifier.js состоит из следующего кода

 var s = document.createElement('script');
var scriptpath = chrome.extension.getURL('js/links.js');
s.src = scriptpath;
s.onload = function() {
};
(document.head || document.documentElement).appendChild(s);
 

И links.js имеет модификацию mutationobserver и addeventlistner для захвата кликабельных ссылок и кнопок, которые есть на странице

 EventTarget.prototype.addEventListener = function (addEventListener) {
    return function () {
        if (arguments[0] === "click") {
            UDAAddNewElement(this);
        }
        addEventListener.call(this, arguments[0], arguments[1], arguments[2]);
    }
}(EventTarget.prototype.addEventListener);

var UDAObserver = new MutationObserver(UDADomMutations);
// starting the mutation observer
UDAObserver.observe(document, {
    childList: true,
    subtree: true
});
 

Когда страница загружена, некоторые из доступных ссылок/кнопок не захватываются, и когда я проверяю первый обнаруженный объект, он отображается где-то в середине страницы. Я подозреваю, что «run_at»: «document_start» не останавливает выполнение dom сначала. Иногда, когда я обновляю, сценарий вводится правильно, и расширение работает должным образом.

Первоначально я пытался с помощью chrome выполнить сценарий, который выполняется в document_idle внутри фонового сценария, как показано ниже. Но мы не можем обнаружить кликабельные объекты при анализе dom, и мы перешли к типу включения скрипта содержимого.

 chrome.tabs.executeScript(tabs[0].id, {
file: "UDAPluginSDK.js",
runAt: "document_idle",
}, function() {});
 

Нашему расширению нужны некоторые сценарии, которые нужно загрузить на страницу для выполнения операций с узлами, таких как преобразование фактического объекта узла в данные json и добавление некоторого пользовательского интерфейса на саму страницу, как показано ниже, на которой открыта правая панель. Для этого мы вводим sdk на страницу, где он добавляет HTML на фактическую страницу и изменяет внешний вид страницы. Пожалуйста, посмотрите, как наша панель отображается справа, как показано на скриншоте ниже.

скриншот

Если мы перейдем к изолированному мировому контексту, то возникнут две проблемы

  1. Передача доменного узла из одного сценария в другой с помощью postmessage
  2. Внедрение скриптов и css на страницу не происходит.

Не мог бы кто-нибудь, пожалуйста, сообщить мне, следует ли нам использовать сценарий с изолированным контентом только для того, чтобы устранить задержку при загрузке сценария, или для этого есть какая-либо альтернатива?

Комментарии:

1. Не используйте src на элементе сценария, используйте textContent и литеральную строку с кодом сценария. Это единственный выход.