У нас есть веб-расширение Firefox / Chrome, которое содержит как фоновые, так и контентные скрипты.Фоновый сценарий поддерживает кэш общих пар ключ / значение, которые необходимы сценариям содержимого.Нетрудно получить к ним доступ через функциональность browser.runtime.SendMessage.
Однако нам необходим доступ к этим парам ключ / значение как можно быстрее при загрузке страницы, прежде чем какие-либо сценарии будут выполняться на исходной странице.Как правило, это невозможно, поскольку асинхронная природа SendMessage означает, что фоновый сценарий не будет достаточно быстро отвечать на запросы, сделанные сценариями содержимого.
Мы искали решения по следующим направлениям:
1.Поиск синхронизации / блокировки
Похоже, что для этого нет никаких механизмов.
2.Инициализация скрипта контента
Мы можем зарегистрировать скрипты контента с помощью browser.contentScripts.register и, возможно, передать копию всего кэша через javascript.Однако это вызывается только один раз, и все последующие вкладки / страницы будут загружать все, что было указано в нем.Мы могли бы - с большим трудом - создать прослушиватель для глобальных изменений кэша и каждый раз перерегистрировать новый скрипт контента.
Есть ли лучшие подходы, чем этот?
Обновление : добавив прослушиватель к browser.webNavigation.onBeforeNavigate, я теперь могу ввести глобальную переменную, которая отображается в выводе консоли:
В background.js:
browser.webNavigation.onBeforeNavigate.addListener(function(details) {
browser.tabs.executeScript(
details.tabId,
{
code: `window.scope.somevariable=true;
console.log("I executed in content script:", "somevariable", window.scope.somevariable);`
}
);
});
В моей библиотеке, которая была введена регистром, я также могу напечатать window.scope в консоль и там вижу переменную.
Однако ... когда я пытаюсь получить доступ к переменной программно,он возвращает "undefined".
В скрипте содержимого:
// this displays "somevariable" among the window scope properties:
console.log("window.scope", window.scope);
// this displays "undefined":
console.log("somevariable", window.scope.somevariable);
Почему зарегистрированная библиотека js может вывести переменную в окно консоли, но на самом деле не может ее прочитать?