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

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

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров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 не было, его добавили потом. Но может что то уже поменялось.

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

Публикации

Истории