К каким API-интерфейсам браузера amp-script разрешен доступ к пользовательскому JavaScript? - PullRequest
2 голосов
/ 03 мая 2019

Теперь, когда у нас есть <amp-script>, который позволяет настраивать сторонний JavaScript для запуска на страницах AMP, я пытаюсь определить, есть ли у меня доступ к той же информации, которую я собираю прямо сейчас на страницах, отличных от AMP. Например. пользовательский агент. У меня есть следующий пример, где у меня есть этот код на странице:

<amp-script layout="container" src="/javascripts/alert.js">
  Output message: <span id="outputMsg"></span>
</amp-script>

И у меня есть этот код в извлеченном файле JS:

const req = new XMLHttpRequest();
console.log('XHR ctor works');

const collectedData = {
    userAgent: navigator.userAgent,
};
console.log('user agent accessible')

document.cookie = "key=value";
console.log('cookie set works');

document.getElementById('outputMsg').innerHTML = JSON.stringify(collectedData, null, 4);
console.log('DOM mutation works');

Идея состоит в том, что это скажет мне, какой код разрешено запускать в условиях, установленных <amp-script>. Я получаю следующий вывод в консоли:

Powered by AMP ⚡ HTML – Version 1905021827420 http://localhost:3000/search?searchterm=diamond
/javascripts/alert.js:32 XHR ctor works
/javascripts/alert.js:35 Uncaught ReferenceError: navigator is not defined
    at Object.<anonymous> (/javascripts/alert.js:35)
    at /javascripts/alert.js:45

Итак, я вижу, что некоторые вещи разрешены, а некоторые нет. Мне удалось изменить этот код, чтобы определить, что единственное, что в этом примере было запрещено, - это доступ к объекту navigator.

Существует ли белый список вещей, разрешенных для страниц AMP с помощью <amp-script>? Я посмотрел в их официальных документах и ​​не смог найти эту информацию.

1 Ответ

3 голосов
/ 04 мая 2019

Поскольку <amp-script> работает на WorkerDOM , лучшее место, чтобы посмотреть на это - документация WorkerDOM.

В частности, существует таблица совместимости WorkerDOM , где вы можете увидеть, какие API доступны в настоящее время.

Когда дело доходит до объекта navigator, это должно поддерживаться через WorkerNavigator . Попробуйте использовать self.navigator.userAgent вместо этого, и это должно работать.

...