Как перенести устаревшее расширение XPCOM на WebExtensions?
Внедренные WebExtensions рассказывают о том, как "... встроить WebExtension в классическое загружаемое расширение или дополнение Add-on SDK".
Но у меня нет ни "начального загрузчика", ни расширения "Add-on SDK", а всего лишь десятилетнее простое старое расширение XPCOM/overlay. У меня нет bootstrap.js для запуска, и я не использую SDK для дополнений, чтобы он ни делал.
Я пытался добавить
<em:bootstrap>true</em:bootstrap>
Но все, что завершается, полностью уничтожает расширение, оно загружает только тот (пустой) новый файл bootstrap.js.
В самом деле, я хочу перенести: данные, которые есть у моего классического расширения, должны быть экспортированы в версию webext для удобства пользователей.
4 ответа
На нашей ошибке отслеживания пользователь разместил полезную ссылку:
https://github.com/mdn/webextensions-examples/tree/master/embedded-webextension-overlay
Который сводится к
const {
LegacyExtensionsUtils,
} = Components.utils.import("resource://gre/modules/LegacyExtensionsUtils.jsm");
const myOverlayEmbeddedWebExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
id: addonId, resourceURI: baseURI,
});
myOverlayEmbeddedWebExtension.startup().then(({browser}) => {
dump(`${addonId} - embedded webext started\n`);
browser.runtime.onMessage.addListener(msg => {
dump(`${addonId} - received message from embedded webext ${msg}\n`);
});
}).catch(err => {
Components.utils.reportError(
`${addonId} - embedded webext startup failed: ${err.message} ${err.stack}\n`
);
});
Что, безусловно, является эквивалентом того, что код начальной загрузки /SDK делает для вас.
Вы можете переписать его только с нуля, используя API WebExtension.
Обратите внимание, что модель WebExtensions требует, чтобы вы использовали только API-интерфейсы, явно экспортированные для использования расширениями, поэтому приготовьтесь отбросить некоторые функции во время перезаписи или даже обнаружить, что невозможно полностью переопределить расширение (если вы не убедите Mozilla реализовать новые API-интерфейсы вам нужно или реализовать это самостоятельно в эксперименте WebExtension - все еще ограниченном Nightly/Dev.edition).
См. Портирование устаревшего расширения Firefox.
[edit] "встроенное WebExtension" действительно требует, чтобы ваше "внешнее" расширение было загружено или основано на SDK на основе дополнений (поэтому нет "классических" расширений), но оно предназначалось только для постепенной миграции и не будет работать в Firefox 57.
Один из вариантов, который я предлагаю людям в похожих ситуациях, - это предоставить функцию экспорта в текущем устаревшем дополнении и импорт в версии WebExtension. Хотя это не автоматическая миграция (это должно быть действие пользователя), она преодолевает некоторые ограничения доступа к локальным файлам WebExtension.
Используя Экспорт, пользователям будет предложено сохранить свои полные данные на жесткий диск.
Затем следующее обновление, которое будет WebExtension, предлагает пользователям импортировать сохраненные данные.
Нет удобного способа сделать это напрямую.
Наиболее эффективный способ сделать это:
- Перепишите ваше расширение как WebExtension. Получите как можно больше функциональности, учитывая ограничения WebExtensions.
- Затем добавьте оболочку начальной загрузки или надстройки SDK (проще), которая передает только данные из исходного расширения на основе оверлеев. Таким образом, часть расширения Bootstrap/Add-on SDK будет минимальной, и единственной задачей будет запуск WebExtension (каждый раз, когда расширение загружается) и передача данных (один раз).
Хотя это не разрешит постепенную миграцию в WebExtension, которая была одним из предполагаемых преимуществ использования встроенных WebExtensions, она позволит вам перенести данные из расширения наложения в версию на основе WebExtensions.
Вы можете сначала перевести его на загрузочный SDK-пакет SDK, затем на встроенные WebExtensions, а затем на полный WebExtension, но это будет значительно более трудоемким, без каких-либо существенных преимуществ.