Внедрить JavaScript в XML-файл с помощью сценария содержимого - PullRequest
0 голосов
/ 11 ноября 2018

Я знаю, что в xml на самом деле не должно быть javascript, но я делаю расширение для браузера, которое должно вставлять некоторый код на каждую страницу, чтобы предоставить пользователю некоторую интересную статистику.

Проблема в том, что я не могу заставить внедренный код работать в XML-документах, поскольку похоже, что созданный мной тег сценария обрабатывается как текст?

Тот же код отлично работает в HTML

Вот что у меня есть:

manifest.json

"content_scripts": [
    {
      "matches": ["<all_urls>"],
        "all_frames": true,
        "match_about_blank": true,
        "run_at": "document_start",
        "js": ["scripts/content/countCalls.js"]
    }
  ]

countCalls.js

let injectedCode = 'console.log("Hello from injected code");';
let script = document.createElement('script');
script.appendChild(document.createTextNode(injectedCode));

let parent = document.head || document.body || document.documentElement;
let firstChild = (parent.childNodes && (parent.childNodes.length > 0)) ? parent.childNodes[0] : null;
if (firstChild) {
  parent.insertBefore(script, firstChild);
} else {
  parent.appendChild(script);
}

test.xml

<?xml version="1.0"?>
<main xmlns='http://www.w3.org/1999/xhtml'>
<script>
console.log("Hello from XML");
</script>
</main>

Когда я загружаю test.xml в браузере, я вижу это:

console.log («Привет из введенного кода»);

и в консоли я просто вижу это:

Привет из XML

Таким образом, введенный код обрабатывается как текст. В любом случае вокруг этого? В противном случае намеренное добавление javascript в xml приведет к обходу расширения

1 Ответ

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

Просто создайте элемент DOM скрипта с пространством имен, совместимым с XML:

let script = document.createElementNS('http://www.w3.org/1999/xhtml', 'script');
...