Здравствуйте,
Это довольно специфичная ошибка, но её последствия могут выйти далеко за рамки данного конкретного случая, поэтому у меня к вам есть вопрос.
(Также прошу прощения за мой английский: я француз, поэтому не являюсь носителем языка…)
Но сначала позвольте объяснить контекст.
Я уже давно использую Discourse для французского форума о Raspberry Pi (forum.raspberry-pi.fr). На этом форуме используется управление рекламой (themoneytizer). Как вы, вероятно, знаете, в Европе мы обязаны внедрять RGPD для защиты конфиденциальности пользователей. Основным игроком (по крайней мере во Франции) в области получения согласия в соответствии с RGPD является Quantcast и их решение «Choice».
Итак, я довольно долго использовал решение Quantcast без каких-либо проблем, пока недавно не заметил, что кнопка «Принять всё» перестала работать корректно. При клике ничего не происходит, а в консоли разработчика я получаю следующую ошибку: “Uncaught TypeError: can’t define property “status”: Function is not extensible”.
Что происходит (насколько я могу судить):
Поверьте мне, когда я говорю, что мне потребовалось очень-очень-очень долгое время, чтобы найти источник проблемы. Похоже, что ember.js (с которым я мало знаком) расширяет некоторые нативные объекты JavaScript, такие как Array, String и Function. И по какой-то причине, кажется, также каким-то образом предотвращает расширение этих объектов (я пока не до конца понял эту часть).
С своей стороны решение Quantcast пытается, вероятно, в функции FunctionAcceptAll (объясняя, что ошибка возникает только при нажатии на кнопки «Принять всё» и «Отклонить всё»), расширить объект, предположительно массив, нормальное поведение которого было изменено ember.js.
После множества исследований для понимания этой ошибки я также обнаружил, что можно изменить поведение Ember.js так, чтобы оно не расширяло прототипы JavaScript, как объясняется на этой странице: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
Я провёл несколько тестов, и ошибка исчезает, если я добавлю строку window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; в файл _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js после строки window.EmberENV.FORCE_JQUERY = true;.
Для тех из вас, кто захочет попробовать, вы можете посмотреть страницу /tst/index.html на форуме (возможно, вам понадобится европейский IP-адрес, чтобы скрипт запустился, я не знаю точно).
Теперь, думаю, у вас есть вся информация, которую я могу предоставить.
Итак, теперь мой вопрос.
Хотя это довольно специфичная ошибка, RGPD становится всё более распространённым в Европе, и ситуация не станет проще.
Quantcast занимает довольно монопольное положение, по крайней мере для тех, кто не может позволить себе платить сотни долларов за внедрение RGPD. Эта ошибка делает невозможным использование Quantcast, а следовательно, и размещение рекламы на Discourse в Европе, что, на мой взгляд, является серьёзной проблемой.
Кроме того, даже если я обнаружил эту ошибку только с Quantcast, такой тип ошибки может возникнуть для множества сторонних скриптов, которые мы вынуждены внедрять для рекламы или других целей, над которыми у нас нет никакого контроля, и которые полагаются на «нормальное» поведение JavaScript для объектов Array, String и Function.
Я недостаточно хорошо знаю код Discourse, поэтому спрашиваю вас: используются ли свойства, добавленные ember.js к объектам Array, String и Function (см. ссылку выше), в Discourse или нет? Если нет, возможно, стоит рассмотреть возможность отключения расширения прототипов в ember.js, чтобы предотвратить побочные эффекты, подобные этому?
Надеюсь, кто-то сможет дать информацию по этому вопросу.
Спасибо.