Перенос WebExtension из Chrome в Firefox?

Я сделал работающее расширение Chrome, которое не упаковано и представляет собой просто каталог на моем компьютере. Я обнаружил, что должен легко перенести это в Firefox.

Я следовал руководству "Перенос расширения Google Chrome" на MDN. и обнаружил, что мой файл манифеста идеален.

Затем я следовал инструкциям по выполнению «временной установки в Firefox" расширения.

Однако, когда я нажимаю на любой файл внутри каталога, ничего не происходит. Расширение не загружается. Любой совет? Я знаю, что расширение отлично работает в Chrome и загружается без ошибок.

manifest.json:

{
  "manifest_version": 2,
  "name": "ER",
  "description": "P",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "background": {
    "scripts": [ "background.js" ]
  },

  "content_scripts": [
    {
      "matches": [ "SiteIwant" ],
      "js": [ "ChromeFormFill.js" ],
      "run_at":  "document_idle" 

    }
  ],

  "permissions": [
    "*://*/*",
    "cookies",
    "activeTab",
    "tabs",
    "https://ajax.googleapis.com/"
  ],
  "externally_connectable": {
    "matches": ["SiteIwant"]
  }
}

ChromeFormFill.js:

// JavaScript source c
console.log("inside content");
console.log(chrome.runtime.id);
document.getElementById("ID").value = chrome.runtime.id.toString();

Background.js

chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
      if (request.data === "info") {
          console.log("Recieving Info");
          return true;
      }
 });

chrome.tabs.create(
{
    url: 'myUrl' 
    active: true
}, function (tab) {
    chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });
});

Run.js просто alert('hi').

Он просто ничего не сделает, когда я попытаюсь загрузить его в Firefox; ничего не случится.


comment
Он не будет работать в Firefox до версии 48 без ключа приложений. в файле manifest.json.   -  person wOxxOm    schedule 11.08.2016
comment
я полностью обновлен на firefox. @wOxxOm   -  person Stevie    schedule 11.08.2016
comment
Манифест объявляет background.js, но в последующей цитате он называется Background.js. Хотя Chrome нечувствителен к регистру в Windows, Firefox мог бы быть более строгим в этом отношении.   -  person wOxxOm    schedule 11.08.2016
comment
пробовал ничего. Я даже создал каталог, в котором есть только базовый манифест, и попытался его портировать, но ничего не загружается. Нет признаков того, что манифест вообще был прочитан   -  person Stevie    schedule 12.08.2016


Ответы (1)


Вопросы:

В manifest.json:

externally_connectable не поддерживается:1

Firefox не поддерживает externally_connectable. Вы можете подписаться на ошибку 1319168 для получения дополнительной информации. В настоящее время нет ожидаемого времени, когда это будет реализовано.

Вам нужно будет обмениваться данными между кодом на вашем сайте и WebExtension, используя другой метод. Способ сделать это — внедрить сценарий содержимого и установить связь между кодом сайта и сценарием содержимого. Распространенные способы сделать это: CustomEvent() или window.postMessage(). Я предпочитаю CustomEvent().

Использование window.postMessage() похоже на то, что вы кричите свое сообщение снаружи и надеетесь, что либо никто больше не слушает, либо что они знают, что им следует игнорировать сообщение. Код других людей, который также использует window.postMessage(), должен быть написан таким образом, чтобы игнорировать ваши сообщения. Вы должны написать свой код, чтобы игнорировать любые потенциальные сообщения от другого кода. Если что-то из этого не было сделано, ваш код или другой код могут работать со сбоями.

Использование CustomEvent() похоже на прямой разговор с кем-то в комнате. Другие люди могут слушать, но для этого им нужно знать о существовании комнаты, и они специально хотят слушать ваш разговор. Пользовательские события принимаются только кодом, который прослушивает указанный вами тип события, который может быть любым допустимым идентификатором, который вы выберете. Это снижает намного вероятность того, что помехи будут возникать по ошибке. Вы также можете использовать несколько разных типов событий, чтобы они означали разные вещи, или просто использовать один тип события и иметь определенный формат для ваших сообщений, который позволяет различать любые возможные типы сообщений, которые вам нужны.

matches значение должно быть действительным (предполагается, что оно было намеренно отредактировано):

У вас есть две строки (одна с конечным ,, одна без; обе синтаксически правильные):

"matches": ["SiteIwant"]

"SiteIwant" должен быть допустимым шаблоном соответствия. Я предполагаю, что это было изменено с чего-то действительного, чтобы запутать сайт, с которым вы работаете. Я использовал:

"matches": [ "*://*.mozilla.org/*" ]

В Background.js:

Линии:

    url: 'myUrl' 
    active: true

должны быть:

    url: 'myUrl',
    active: true

[Обратите внимание на , после 'myUrl'.] Кроме того, myUrl должен быть действительным URL-адресом. Я использовал:

    url: 'http://www.mozilla.org/',

Ошибка Firefox 48 (уже давно исправлена):

Ваша линия:

chrome.tabs.executeScript(tab.id, { file: 'Run.js', runAt: "document_idle" });

В Firefox 48 эта строка выполняется до того, как вкладка становится доступной. Это ошибка. Это исправлено в Firefox Developer Edition и Ночной. Вам понадобится один из них для тестирования/продолжения разработки.

Проблемы в ChromeFormFill.js:

Еще одна ошибка Firefox 48 (уже давно исправлена):

chrome.runtime.id is undefined. Это исправлено в Developer Edition и Nightly.

Возможная проблема со сценарием контента:

Я собираюсь предположить, что в вашем HTML есть элемент с идентификатором = 'ID'. В противном случае ваше document.getElementById("ID") будет null. Вы не проверяете, является ли возвращаемое значение допустимым.

Запуск вашего примера кода

Как только все эти ошибки были устранены и запущены в Firefox Nightly или Developer Edition, все заработало нормально. Однако у вас не было ничего, что полагалось бы на externally_connectable, что не будет работать.


  1. agaggi заметил, что я забыл включить эту проблему в исходную версию своего ответа.
person Makyen♦    schedule 12.08.2016