Веб-просмотр Android отказался выполнять встроенный скрипт

Я пишу приложение для Android, в котором размещается веб-просмотр для загрузки веб-страницы. Я получил много ошибок, как показано ниже в logcat:

Отказано в выполнении встроенного сценария, поскольку он нарушает следующую директиву политики безопасности содержимого: «default-src 'self'». Обратите внимание, что «script-src» не был задан явно, поэтому «default-src» используется как запасной вариант.

Обратите внимание, что Javascript выполняется хорошо, если это не встроенный скрипт. Например, с файлом HTML, как показано ниже:

<htnl>
<head>
<script type="text/javascript" src="abc.js"></script>
</head>
<body>
<script type="text/javascript">
    alert("This is inline script");
</script>
</body>
</html>

Скрипт в abc.js выполняется правильно, но встроенный скрипт отказывается выполняться.

Я понимаю, что веб-просмотр отказывается выполнять встроенный Javascript из-за «Политики безопасности контактов». Но веб-страница должна выполнять эти встроенные сценарии для правильной работы, и я не могу внести какие-либо изменения на веб-страницу.

Такая проблема только на KitKat (Android 4.4)

Есть ли способ решить эту проблему, изменить «Политику безопасности контента», чтобы разрешить выполнение встроенного сценария.


person Dong Nguyen    schedule 25.05.2014    source источник
comment
возможный дубликат Android: не удается получить javascript для работы в WebView даже с setJavaScriptEnabled(true)   -  person Dalorzo    schedule 25.05.2014
comment
@Dalorzo: Спасибо за ссылку, я уже видел этот вопрос, но моя проблема в другом. Моя проблема, связанная с политикой безопасности контента, Javascript выполнялся хорошо, если это не встроенный Javascript.   -  person Dong Nguyen    schedule 25.05.2014
comment
здравствуйте, вы нашли решение этой проблемы? я сталкиваюсь с тем же.   -  person EladB    schedule 06.01.2016


Ответы (1)


Согласно информации от разработчиков WebView, внедренные javascripts запускаются на самой хост-странице, а не в изолированном мире, как с расширениями Chromium. Вот почему они должны проходить общие проверки безопасности, налагаемые заголовком Content Security Policy (если он существует). В результате может быть невозможно внедрить скрипт в виде файла через атрибут src или встроенный, или обоими способами, в зависимости от директивы заголовка (например, если упоминается unsafe-inline, вы не сможете внедрить тег скрипта со встроенным кодом).

Обходной путь заключается в использовании методов loadUrl или evaluateJavascript для выполнения кода javascript «как есть», без добавления тега script. Например:

webview.loadUrl("javascript:alert('hello')");

будет успешно выполнен.

Для Android 4.4 и выше рекомендуется использовать новый метод evaluateJavascript, потому что loadUrl имеет побочный эффект, когда ваше приложение нацелено на одну из этих более новых версий Android (и я думаю, что это относится к большинству проектов в настоящее время): если скрипт возвращает значение - заменит содержимое DOM текущей страницы. Для целей до 4.4 оба метода одинаковы, за исключением возможности вернуть значение с помощью необязательного обратного вызова в evaluateJavascript.

Можно было бы придумать и другие трюки, но этого должно быть достаточно, чтобы решить ваши проблемы.

person Stan    schedule 13.01.2016
comment
Вы также говорите, что если у меня есть локальный размещенный html-файл с внешними скриптами .js в заголовке (например: ‹script src​=cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.5.2/), они не быть доступным? - person Mike6679; 15.03.2021