Как правильно внедрить iframe в DOM с помощью Safari App Extensions? - PullRequest
0 голосов
/ 16 ноября 2018

Я портирую свое 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?

1 Ответ

0 голосов
/ 19 ноября 2018

Оборачивая мой код между этим условием, мы добились цели Документация Apple в части Inject Scripts.

if (window.top === window) {
    // The parent frame is the top-level frame, not an iframe.
    // All non-iframe code goes before the closing brace.
    document.addEventListener('DOMContentLoaded', function(e) {
        var newElement = document.createElement("script");
        newElement.src = safari.extension.baseURI + "bundle.js";
        document.body.insertBefore(newElement, document.body.firstChild);
    });
}
...