Я ищу способ отображать изолированное наложение на некоторых веб-сайтах с помощью WebExtensions.
Мне кажется, что iframe подходит для этого, поскольку он предоставляет совершенно отдельную область для css, js и DOM. И еще одна интересная вещь заключается в том, что целевой веб-сайт не сможет читать или изменять контент.
В расширениях Chrome это кажется возможным без каких-либо проблем, но с WebExtensions в Firefox, несмотря на то, что они имеют один и тот же синтаксис, я получаю предупреждения/ошибки безопасности, и это не работает.
Я пробовал две разные вещи:
Создание iframe без атрибута src и внедрение его в тело веб-сайта. Этот метод не удался, потому что я получаю ошибки/предупреждения CSP при выполнении
iframe.contentWindow.document.open()
.
Соответствующий код сценария контента:let html = ` <!DOCTYPE html> <html> <head></head> <body> <h1>TEST</h1> </body> </html> ` let iframe = document.createElement('iframe') document.body.appendChild(iframe) iframe.contentWindow.document.open() iframe.contentWindow.document.write(html) iframe.contentWindow.document.close()
Еще одна вещь, которую я пробовал (что имело бы гораздо больше смысла, поскольку это запретило бы веб-сайту доступ к контенту), заключалась в том, чтобы поместить мой код iframe в файл (
overlay.html
) в моем WebExtension и заставить iframe загрузить его, установив его src наbrowser.extension.getURL('overlay.html')
.
Соответствующий код контента-скрипта:let iframe = document.createElement('iframe') iframe.src = browser.extension.getURL('overlay.html') document.body.appendChild(iframe)
В манифесте я определил overlay.html как
web_accessible_resources
для этого:"web_accessible_resources": [ "overlay.html" ],
Дело в том, что iframe просто не загружает файл overlay.html. Но он точно есть, иначе бы
location.href = browser.extension.getURL('overlay.html')
не работало. Было бы очень удобно, если бы это работало, так как я мог бы сохранить весь оверлей (html, css, js) в виде отдельных файлов в своем расширении. Как будто это будет отдельный сайт. И используя контент-скрипт, я мог бы получить к нему доступ, чтобы добавить новые данные или что-то еще.
Изменить:
На данный момент я использую атрибут srcdoc
своего iframe для установки исходного кода, который он должен содержать (спасибо wOxxOm за это). Так что по крайней мере у меня есть что-то, что работает сейчас. Но что мне действительно не нравится в этом подходе, так это то, что я не могу взаимодействовать с содержимым iframe из своего сценария содержимого. Интересно, что я могу взаимодействовать с родительской страницей из js-кода iframe, но опять же не со скриптом контента. Это также очень грязно, неудобно и сложно поддерживать, чтобы поместить весь ваш код html, css, js в одну строку вместо нескольких файлов, как на обычном веб-сайте.
iframe.srcdoc
. Что касается изоляции стилей, вы можете использовать Shadow DOM вместо iframe. - person wOxxOm   schedule 19.01.2017file:///C:/
. Я думаю, что это связано с собственным CSP расширения. Я все еще не знаком с синтаксисом, поэтому не могу предложить решение. Будьте осторожны, выискивая дыры, не полностью понимая, что еще вы можете непреднамеренно допустить. 2) Я создал и сразу же добавил iframe. Прямое присвоение НЕ работает одинаково для всех атрибутов, хотяiframe.src
у меня работало. Попробуйте указать ВСЕ атрибуты с помощьюiframe.setAttribute( attribute, value );
В частности, я думаю, чтоclass
проблематичен. - person   schedule 21.01.2017class
, установленного в атрибутеiframe
, может привести к риску возникновения проблем с конфликтами классов, которые метод Shadow DOM пытается свести к минимуму. Этот метод является новым для меня, поэтому я не могу комментировать дальше без исследования. - person   schedule 21.01.2017