Я портирую свое WebExtension на Safari, используя расширение приложения Safari.
Мое расширение - это вставка iframe в DOM, поэтому я подумал, чтобы что-то вроде этого сценария вставки было загружено как SFSafariContentScript
.
document.addEventListener('DOMContentLoaded', function(e) {
var newElement = document.createElement("script");
newElement.src = safari.extension.baseURI + "bundle.js";
document.body.insertBefore(newElement, document.body.firstChild);
});
Дело в том, что DOMContentLoaded
событие, кажется, снова запускается, когда вводится мой iframe, что приводит к бесконечному циклу.
Такое поведение отличается от того, что вы ожидаете от простого сценария внедрения с двумя файлами index.html
и index.js
, который работает, как и ожидалось.
───────┬───────────────────────────────────────────────────────────────────
│ File: index.html
───────┼───────────────────────────────────────────────────────────────────
1 │ <html>
2 │ <head>...</head>
3 │ <body><div>...</div></body>
4 │ <script src="index.js"></script>
5 │ </html>
───────┴───────────────────────────────────────────────────────────────────
───────┬───────────────────────────────────────────────────────────────────
│ File: index.js
───────┼───────────────────────────────────────────────────────────────────
1 │ document.addEventListener('DOMContentLoaded', function(e) {
2 │ var newElement = document.createElement('script');
3 │ newElement.src = './bundle.js';
4 │ document.body.insertBefore(newElement, document.body.firstChild);
5 │ });
───────┴───────────────────────────────────────────────────────────────────
Если я заменим addEventListener
на setTimeout
из нескольких секунд в моем расширении приложения Safari, мое расширение будет правильно введено и работает хорошо, но при выборе произвольного времени для ввода iframe мне кажется грязным.
Как правильно внедрить iframe в DOM с помощью расширений Safari App?