Использование fontawesome в Firefox Webextension Contentscript

Я хотел бы оформить свое веб-расширение с помощью значков Fontawesome. Для всплывающего меню и настроек расширения это работает без проблем, но мои сценарии содержимого не могут получить к нему доступ.

Чтобы создать минимальный пример, я настроил репозиторий:

git clone https://github.com/lhk/fa_test.git
cd fa_test
npm install -d

Он внедряет потрясающий javascript в качестве сценария контента. манифест.json:

"content_scripts": [
      {
        "matches": [
          "https://*.wikipedia.org/*"
        ],
        "js": [
          "node_modules/jquery/dist/jquery.min.js",
          "./node_modules/@fortawesome/fontawesome-free/js/all.js",
          "./content.js"
        ]
      }
    ],

А затем добавляет значок в конец веб-сайта (только википедия): контент.js:

$(function(){
    $('<div> <i class = "fas fa-question-circle fa-2x"></i> </div>').appendTo('body')
})

В Chrome это работает отлично, вот как это выглядит: Использование fontawesome в Firefox Webextension Contentscript

В Firefox значка просто нет (обратите внимание, скрипты внедряются только в Википедию, тестируйте там).

Сначала я подумал, что это связано с CSP, возможно, fontawesome делает некоторые запросы к CDN, которые фильтруются Firefox. Но я не могу найти такие запросы в панели сети настроек разработчика. Ни в одной из веб-консолей также нет сообщений об ошибках.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FontAwesome наблюдает за мутациями DOM, чтобы заменить разметку <i.../> элементом svg. Из того, что я вижу, замена должна происходить внутри обратного вызова requestAnimationFrame, и по какой-то причине обратный вызов requestAnimationFrame не вызывается. После исследования и отладки я пришел к очень странному выводу, но я уверен, что нашел причину и даже достойный обходной путь.

Подозреваю следующий баг:
В сценарии содержимого Webextension, когда глобальная функция requestAnimationFrame назначается переменной без привязки к window, она не работает.

Font Awesome делает именно это правильно, здесь, и предотвращает вызов этот обратный вызов, что имеет решающее значение для процесса замены, о котором я упоминал выше.

Таким образом, обходным путем является добавление следующего файла в список сценариев содержимого, и он должен работать:

/* raf-ff-fix.js */
window.requestAnimationFrame = window.requestAnimationFrame.bind(window)
/* manifest.json */

// ...
"js": [
      "./raf-ff-fix.js",
      // ....
]

Другие вопросы по теме