Выставить функцию на странице при установке через chrome: // extensions - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть UserScript , работающий с @grant none, установленный непосредственно в расширениях chrome: // без Tampermonkey, и я пытаюсь определить функцию в глобальном пространстве имен страницы хоста:

window.setRefinedTwitterLiteFeatures = features => {
  settings = Object.assign(settings, features)
  localStorage.setItem(storageKey, JSON.stringify(settings))
  setFeatures()
}

К сожалению, это не похоже на работу.Я также пытался использовать unsafeWindow без удачи.

1 Ответ

0 голосов
/ 23 февраля 2019

Похоже, вы устанавливаете его, как описано в репозитории - то есть прямо в chrome: // extensions - но Chrome не поддерживает среду без ящиков в отличие от Tampermonkey.Единственный способ имитировать это создать элемент сценария DOM, назначить код, который вы хотите предоставить, для textContent и добавить, например, к document.body.Как показано в каноническом ответе «Вставьте код в контекст страницы с помощью скрипта контента» .

Следующая проблема - CSP Twitter, который запрещает код в элементах встроенного скрипта.К счастью, как мы видим в сетевом инспекторе devtools для запроса главной страницы, CSP имеет исключение nonce, которое мы можем использовать повторно:

function runScriptInPageContext(text) {
  const script = document.createElement('script');
  script.text = text;
  script.nonce = (document.querySelector('script[nonce]') || {}).nonce;
  document.documentElement.appendChild(script);
  script.remove();
}

Примеры использования, запускающие код сразу:

runScriptInPageContext("alert('foo')");

runScriptInPageContext(`(${() => {
  alert('foo');
})()`);

Пример использования, представляющего глобальную функцию:

runScriptInPageContext(function foo() {
  alert('foo');
});
...