Я работаю над расширением/надстройкой для браузера. У нас это работает в Chrome, поэтому я пытаюсь заставить его работать в Firefox.
Я получил дополнение для загрузки в Firefox Developer Edition 49.0a2 (25 июля 2016 г.).
В моем расширении используется content_script, для которого задано значение run_at: document_start
, поэтому оно может внедрить тег script перед запуском других скриптов страницы, чтобы сделать объект глобально доступным для веб-сайтов.
Казалось, что это отлично работает в Chrome, но в Firefox это оказалось чем-то вроде состояния гонки, когда другие ресурсы страницы загружаются первыми большую часть времени.
Существует ли стратегия для загрузки сценария контента таким образом, чтобы он мог внедрить и загрузить сценарий до запуска любых других сценариев страницы?
Когда я добавляю журналы, я могу довольно хорошо изолировать происходящее. В этом примере контент-скрипт:
// inject in-page script
console.log('STEP 1, this always happens first')
var scriptTag = document.createElement('script')
scriptTag.src = chrome.extension.getURL('scripts/inpage.js')
scriptTag.onload = function () { this.parentNode.removeChild(this) }
var container = document.head || document.documentElement
// append as first child
container.insertBefore(scriptTag, container.children[0])
Теперь, если файл scripts/inpage.js
просто запускает журнал, например
console.log('STEP 2, this should always run second')
И я захожу на страницу с таким скриптом:
console.log('Step 3, the page itself, should run last')
На практике Шаг 2 и Шаг 3 выполняются в недетерминированном порядке.
Большое спасибо!
У меня есть совместимая с Firefox версия скрипта в общедоступном репозитории на специальной ветке, если вы осмелитесь попробовать сами: https://github.com/MetaMask/metamask-plugin/tree/FirefoxCompatibility