Hola,
Este es un error bastante específico, pero su impacto podría ir mucho más allá de este caso concreto, por lo que tengo una pregunta al respecto.
(También, me disculpo por mi inglés; soy francés, así que no soy un hablante nativo en absoluto…)
Pero primero, permíteme explicar el contexto.
Llevo un tiempo usando Discourse para un foro en francés sobre Raspberry Pi (forum.raspberry-pi.fr). Este foro utiliza gestión de publicidad (Themoneytizer). Como probablemente sepas, Europa nos obliga a implementar el RGPD para proteger la privacidad de los usuarios. El actor principal (al menos en Francia) para el consentimiento del RGPD es Quantcast y su solución “Choice”.
Así que he estado usando la solución de Quantcast durante bastante tiempo sin problemas, hasta que recientemente noté que el botón “Aceptar todo” ya no funciona correctamente. Al hacer clic, no ocurre nada, y al revisar la consola de desarrollo obtengo este error: “Uncaught TypeError: can’t define property ‘status’: Function is not extensible”.
Lo que sucede (al menos según mi mejor comprensión):
Créanme cuando digo que me llevó muchísimo tiempo encontrar la fuente del problema. Aparentemente, Ember.js (con el cual no estoy muy familiarizado) extiende algunos objetos nativos de JavaScript, como Array, String y Function. Y por alguna razón, parece también impedir de alguna manera la extensión de esos objetos (aún no he comprendido completamente esta parte).
Por su parte, la solución de Quantcast intenta, probablemente en la función FunctionAcceptAll (lo que explica que el error solo ocurra al hacer clic en los botones “Aceptar todo” y “Rechazar todo”), extender un objeto, presumiblemente un array, cuyo comportamiento normal ha sido modificado por Ember.js.
Después de mucha investigación para entender este error, también descubrí que es posible modificar el comportamiento de Ember.js para que no extienda los prototipos de JavaScript, como se explica en esta página: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
He realizado algunas pruebas y el error desaparece si agrego la línea window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; en el archivo _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js, justo después de la línea window.EmberENV.FORCE_JQUERY = true;.
Para aquellos que quieran probarlo, pueden visitar la página /tst/index.html en el foro (es posible que necesiten una IP europea para que el script se inicie; no tengo idea de por qué).
Ahora creo que les he proporcionado toda la información que puedo ofrecer.
Ahora, aquí está mi pregunta.
Aunque este es un error bastante específico, el RGPD está cada vez más presente en Europa y no será más fácil de cumplir.
Quantcast ocupa una posición casi monopolística, al menos para aquellos actores que no pueden permitirse pagar cientos de dólares para implementar el RGPD. Este error impide cualquier uso de Quantcast y, por lo tanto, de la publicidad en Discourse en Europa, lo cual me parece un gran problema.
Además, aunque solo encontré el error usando Quantcast, este tipo de problemas podría ocurrir con muchos scripts de terceros que debemos integrar para anuncios u otros fines, sobre los cuales no tenemos ningún control y que dependen del comportamiento “normal” de JavaScript para los objetos Array, String y Function.
No conozco lo suficiente el código de Discourse, así que les pregunto: ¿las propiedades que Ember.js agrega a los objetos Array, String y Function (ver el enlace anterior) son utilizadas por Discourse o no? Si no lo son, ¿quizás deberíamos considerar deshabilitar las extensiones de prototipos de Ember.js para evitar efectos secundarios como este?
Espero que alguien pueda darme información al respecto.
Gracias