Как стать автором
Обновить

Тварь ли я дрожащая или право имею? Берем чужие сайты под свой контроль. Часть 2 — Пользовательские скрипты в Chrome

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров9.9K
Всего голосов 2: ↑2 и ↓0+2
Комментарии6

Комментарии 6

Чтобы разрешить использование userScripts API, пользователь должен помимо этого обязательно включить еще и галочку Developer mode (Режим разработчика) на странице списка установленных расширений.

Используйте:

chrome.scripting.executeScript(
  injection: ScriptInjection,
  callback?: function,
)

Потому что в Chrome реализовано только подключение JS-скриптов. Но разве это проблема?

Конечно не проблема:

chrome.scripting.insertCSS(
  injection: CSSInjection,
  callback?: function,
)

chrome.scripting.executeScript в данном случае не подойдет, т. к. в качестве аргумента требует либо указать файл js для выполнения, либо функцию. Т. е. данный метод предназначен для фиксированного, заранее прописанного в расширении js-кода. В данном же случае нам нужно выполнить динамический произвольный код, извлекаемый из локального хранилища. Т. е. нам нужно по сути выполнить код, который хранится в строковом виде, типа "let h = 'hello, world!'; alert(h);". Используя executeScript, мы такой код в виде строки не запустим, использовать eval Chrome не дает из-за ограничений безопасности.

А вот с chrome.scripting.insertCSS, думаю, вы правы, вполне можно было бы использовать. Другое дело, что по трудозатратности такой вариант ни в чем не выигрывает - нужно самостоятельно выполнять проверку текущего адреса с сохраненными шаблонами URL и подцеплять CSS. К тому же, если я уже все равно использую userScripts для хранения js-кода, вполне удобно обернуть CSS в JS и использовать один и тот же функционал и для скриптов, и для стилей, т.е. работать с ними как с идентичными объектами.

Для executeScript, можно использовать Ваш подход к CSS.

Вы имеете ввиду внедрение кода через вставку элемента script в DOM дерево? Нет, такой вариант тоже не проходит. Chrome запрещает вставку любого динамического js-кода в обход официального API userScripts. Если не ошибаюсь, в Manifest V2 такой подход работал, но сейчас в 3-й версии ужесточили этот момент.

Насколько мне известно, если в executeScript выставить ExecutionWorld: "MAIN" (по умолчанию ISOLATED) то не должно быть проблем. Изначально при появлении executeScript,параметра ExecutionWorld не было, его добавили потом. Но может что то уже поменялось.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации