Расширение Chrome: как вставить сценарий содержимого на страницу iframe

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

На всех этих страницах iframe работает отдельный сценарий содержимого, который может определять, что он находится в соответствующем iframe, и я бы хотел, чтобы он загружал этот другой сценарий содержимого. После некоторых споров, он может получить frameId этого iframe, но chrome.tabs.executeScript () принимает только tabId, а не frameId, поэтому скрипт загружается на странице верхнего уровня, а не в желаемом iframe.

Обратите внимание, что сценарий, который я хочу внедрить, должен запускаться как сценарий содержимого с доступом к доступным API-интерфейсам Chrome.

Можно ли сделать это? Как?


Обновление: Ах, вы, конечно же, правы, wOxxOm, что «frameId может быть указан во втором параметре executeScript». Еще раз спасибо, ответьте, и я его приму. Мне, видимо, нужно читать повнимательнее. Я - давний программист, но новичок в расширениях Chrome, мне есть что усвоить.

Вторичный вопрос: похоже, мне нужно добавить <all_urls> или http://*/* и https://*/*, разрешение на манифест, чтобы это было разрешено. Основной content_script, который делает это, имеет аналогичные шаблоны соответствия, и я мог бы добавить туда и этот вторичный скрипт, но на самом деле он нужен только для страниц, показанных в этих iframe, поэтому мне это кажется лучше. Есть ли у этого способа другие недостатки или есть какой-то лучший подход, кроме xhr / eval?


person enigment    schedule 31.03.2018    source источник
comment
frameId можно указать во втором параметре executeScript, см. документацию. В качестве альтернативы вы можете использовать зло eval в своем сценарии содержимого: сначала xhr / fetch скрипт дополнительного содержимого, затем оцените его.   -  person wOxxOm    schedule 31.03.2018
comment
@wOxxOm, обновил вопрос своим ответом и дополнительным вопросом.   -  person enigment    schedule 31.03.2018
comment
Да, executeScript может работать только на разрешенных URL-адресах (например, указанных в ключе разрешений или в content_scripts - ›соответствует ключу). Единственным недостатком является то, что в предупреждении о разрешении перед установкой будет указано, что вашему расширению требуется доступ ко всем сайтам. Альтернативой является использование дополнительных разрешений.   -  person wOxxOm    schedule 31.03.2018
comment
Необязательные разрешения не слетят, эта часть расширения вообще не будет работать без этого скрипта. Мне нужно либо загружать его всегда через манифест, либо в коде. У основного сценария содержимого есть совпадения: [http: // * / *, https: // * / *]. Будет ли это давать такое же предупреждение при установке? Если да, то за эту фигуру не налагается никакого дополнительного штрафа. В общем, вы бы сделали xhr / eval или это?   -  person enigment    schedule 31.03.2018
comment
Предупреждение в вашем случае не изменится (дополнительная информация). Что касается xhr + eval внутри сценария содержимого, это решение для случая, когда эти iframe уже запускают сценарий содержимого, поэтому решать вам.   -  person wOxxOm    schedule 31.03.2018