Bonjour,
Il s’agit d’un bug assez spécifique, mais son impact pourrait dépasser largement ce cas précis, et j’ai donc une question à ce sujet.
(Par ailleurs, je m’excuse pour mon anglais ; je suis français et donc loin d’être un locuteur natif…)
Mais d’abord, laissez-moi expliquer le contexte.
J’utilise Discourse depuis un certain temps pour un forum français sur le Raspberry Pi (forum.raspberry-pi.fr). Ce forum utilise un système de gestion publicitaire (themoneytizer). Comme vous le savez probablement, l’Europe nous oblige à mettre en œuvre le RGPD pour protéger la vie privée des utilisateurs. Le principal acteur (du moins en France) pour le consentement RGPD est Quantcast et sa solution « Choice ».
J’ai donc utilisé la solution de Quantcast pendant un certain temps sans aucun problème, jusqu’à récemment où j’ai remarqué que le bouton « Accepter tout » ne fonctionnait plus correctement. Au clic, rien ne se passe, et en regardant dans la console de développement, j’obtiens cette erreur : « Uncaught TypeError: can’t define property “status”: Function is not extensible ».
Voici ce qui se passe (du moins à ma connaissance) :
Croyez-moi quand je dis que cela m’a pris un loooooong temps pour trouver la source du problème. Apparemment, ember.js (avec lequel je ne suis pas très familier) étend certains objets JavaScript natifs, tels que Array, String et Function. Et pour une raison quelconque, cela semble également empêcher l’extension de ces objets d’une certaine manière (je n’ai pas encore totalement compris cette partie).
La solution de Quantcast, de son côté, tente probablement sur la fonction FunctionAcceptAll (ce qui explique que le bug ne se produit que lors du clic sur le bouton « Accepter tout » et le bouton « Refuser tout ») d’étendre un objet, je présume un tableau, dont le comportement normal a été modifié par ember.js.
Après de nombreuses recherches pour comprendre ce bug, j’ai également découvert qu’il est possible de modifier le comportement d’Ember.js pour qu’il n’étende pas les prototypes JavaScript, comme expliqué sur cette page : https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
J’ai effectué quelques tests, et le bug disparaît si j’ajoute la ligne window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; dans le fichier _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js, juste après la ligne window.EmberENV.FORCE_JQUERY = true;.
Pour ceux d’entre vous qui voudraient essayer, vous pouvez consulter la page /tst/index.html sur le forum (il vous faudra peut-être une adresse IP européenne pour que le script se lance, je n’en ai aucune idée).
Maintenant, je pense que vous avez toutes les informations que je peux vous fournir.
Voici donc ma question.
Même si ce bug est assez spécifique, le RGPD est de plus en plus présent en Europe en ce moment, et les choses ne vont pas devenir plus faciles.
Quantcast occupe une position quasi monopolistique, du moins pour les acteurs qui ne peuvent pas se permettre de payer des centaines de dollars pour mettre en œuvre le RGPD. Ce bug empêche toute utilisation de Quantcast, et donc de la publicité sur Discourse en Europe, ce qui me semble être un gros problème.
De plus, même si j’ai trouvé ce bug uniquement avec Quantcast, ce type de bug pourrait en fait se produire pour de nombreux scripts tiers que nous devons intégrer pour les publicités ou autres, sur lesquels nous n’avons aucun contrôle et qui reposent sur le comportement « normal » de JavaScript pour les objets Array, String et Function.
Je ne connais pas assez le code de Discourse, alors je vous demande : les propriétés ajoutées par ember.js sur les objets Array, String et Function (voir le lien ci-dessus) sont-elles utilisées par Discourse ou non ? Si non, ne devrions-nous pas envisager de désactiver les extensions de prototypes d’ember.js afin d’éviter des effets secondaires comme celui-ci ?
J’espère que quelqu’un pourra me donner des informations à ce sujet,
merci