Преобразование расширения Chrome в Firefox - PullRequest
0 голосов
/ 12 сентября 2018

У нас есть полностью работающее расширение для 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.

enter image description here

ОБНОВЛЕНИЕ: после долгих экспериментов кажется, что всплывающее окно в 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}&currentUrl=${document.URL}`);

    this._logger.logInfo("Append iframe sidebar");
    document.body.appendChild(iframe);
}
...