У нас есть полностью работающее расширение для Chrome, которое мы пытаемся заставить работать в Firefox.Он имеет фон, контент и скрипт всплывающих окон, каждый из которых отправляет сообщения друг другу.
Мы загрузили это, используя about: отладку как временное расширение.Однако в Firefox, когда мы пытаемся отправить какие-либо сообщения в скрипт содержимого, мы получаем эту ошибку:
Не проверено значение lastError: Ошибка: не удалось установить соединение.Получающий конец не существует.
Мы используем следующий код для отправки сообщения на все вкладки:
chrome.tabs.query({}, function (tabs) {
let lastTabId = tabs[0].id;
chrome.tabs.sendMessage(lastTabId, imessage);
});
Это дает нам сообщение о невозможности установить ошибку, но если я ее исправлюto:
chrome.tabs.query({ active: true }, function (tabs) {
let lastTabId = tabs[0].id;
chrome.tabs.sendMessage(lastTabId, imessage);
});
Тогда мы больше не получаем ошибку, но хотим транслировать на все вкладки, это без проблем работает в Chrome.
В дополнение к вышесказанному, когда мы пытаемсяотправить сообщение из всплывающего окна, которое мы получим:
Ошибка типа: chrome.tabs не определена (мы также пробовали браузер с той же ошибкой)
Я вышел из браузераи chrome при запуске в Firefox и вкладках отсутствует, но работает в chrome и находится внутри popup.js.
Существуют ли более строгие ограничения безопасности в Firefox, препятствующие доступу popup.js к вкладкам?Мы добавили вкладки в качестве разрешения в нашем манифесте.
Ниже представлен объект браузера в Firefox, в котором отсутствуют вкладки, но нет в Chrome.
ОБНОВЛЕНИЕ: после долгих экспериментов кажется, что всплывающее окно в chrome ведет себя как фоновый скрипт со всеми привилегиями и разрешениями, которые имеет фон, но в Firefox оно ведет себя как скрипт содержимого и не имеет доступа к chrome.tabs.
Манифест:
{
"manifest_version": 2,
"name": "<removed>",
"description": "<removed>",
"author": "<removed>",
"version": "1",
"permissions": [
"activeTab",
"tabs",
"webNavigation",
"storage",
"http://*/*",
"https://*/*"
],
"options_ui": {
"page": "options.html"
},
"content_scripts": [
{
"matches": [
"<removed>"
],
"js": [
"js/vendor.js",
"js/content_script.js"
]
}
],
"browser_action": {
},
"background": {
"scripts": [
"js/vendor.js",
"js/background.js"
]
},
"web_accessible_resources": [
"popup.html",
"content/bootstrap.min.css"
]
}
Также мы не используем всплывающее окно в качестве всплывающего окна, мы загружаем его в скрипт содержимого и внедряем в страницу следующим образомв качестве боковой панели.Может ли это изменить всплывающее окно, чтобы оно больше походило на скрипт содержимого и не имело доступа к browser.tabs или chrome.tabs.
private buildSidebar() {
this._logger.logTimeStart("buildSidebar");
this._logger.logInfo("Build iframe sidebar");
if (this.hasSidebarBeenInititalise()) {
return;
}
let iframe = document.createElement('iframe');
iframe.id = "extension-sidebar";
iframe.height = "100%";
iframe.style.background = "#CCC";
iframe.style.height = "100%";
iframe.style.width = "0px";
iframe.style.position = "fixed";
iframe.style.top = "0px";
iframe.style.right = "0px";
iframe.style.zIndex = "9999999999999999999999";
iframe.frameBorder = "none";
iframe.src = chrome.extension.getURL(`popup.html?contentScriptIdentifier=${
this._uniqueIdentifier}¤tUrl=${document.URL}`);
this._logger.logInfo("Append iframe sidebar");
document.body.appendChild(iframe);
}