#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 на фактическую страницу и изменяет внешний вид страницы. Пожалуйста, посмотрите, как наша панель отображается справа, как показано на скриншоте ниже.
Если мы перейдем к изолированному мировому контексту, то возникнут две проблемы
- Передача доменного узла из одного сценария в другой с помощью postmessage
- Внедрение скриптов и css на страницу не происходит.
Не мог бы кто-нибудь, пожалуйста, сообщить мне, следует ли нам использовать сценарий с изолированным контентом только для того, чтобы устранить задержку при загрузке сценария, или для этого есть какая-либо альтернатива?
Комментарии:
1. Не используйте
src
на элементе сценария, используйтеtextContent
и литеральную строку с кодом сценария. Это единственный выход.