Hallo,
dies ist zwar ein recht spezifischer Fehler, aber seine Auswirkungen könnten weit über diesen Einzelfall hinausgehen, daher habe ich dazu eine Frage.
(Auch möchte ich mich für mein Englisch entschuldigen; ich bin Franzose und kein Muttersprachler…)
Aber zunächst möchte ich den Kontext erklären.
Ich verwende Discourse schon seit einiger Zeit für ein französisches Forum über den Raspberry Pi (forum.raspberry-pi.fr). Dieses Forum nutzt ein Werbeanzeigen-Management (Themoneytizer). Wie Sie wahrscheinlich wissen, verpflichtet uns Europa zur Umsetzung der DSGVO zum Schutz der Privatsphäre der Nutzer. Der wichtigste Akteur (zumindest in Frankreich) für die DSGVO-Einwilligung ist Quantcast mit ihrer „Choice“-Lösung.
Ich habe die Quantcast-Lösung also schon eine ganze Weile ohne Probleme genutzt, bis ich kürzlich feststellte, dass die Schaltfläche „Alle akzeptieren“ nicht mehr richtig funktioniert. Beim Klicken passiert nichts, und in der Entwicklerkonsole erhalte ich folgenden Fehler: „Uncaught TypeError: can’t define property ‘status’: Function is not extensible“.
Was passiert (zumindest nach meinem besten Verständnis):
Glauben Sie mir, wenn ich sage, dass es mir eine unendlich lange Zeit gekostet hat, die Ursache des Problems zu finden. Offensichtlich erweitert Ember.js (mit dem ich mich sehr wenig auskenne) einige native JavaScript-Objekte wie Array, String und Function. Und aus irgendeinem Grund scheint es diese Objekte auch auf eine Weise zu verhindern, dass sie erweitert werden können (diesen Teil habe ich noch nicht vollständig verstanden).
Die Quantcast-Lösung versucht ihrerseits, wahrscheinlich in der Funktion FunctionAcceptAll (was erklärt, warum der Fehler nur beim Klicken auf die Schaltflächen „Alle akzeptieren“ und „Alle ablehnen“ auftritt), ein Objekt zu erweitern, vermutlich ein Array, dessen normales Verhalten durch Ember.js geändert wurde.
Nach vielen Recherchen zum Verständnis dieses Fehlers habe ich auch festgestellt, dass es möglich ist, das Verhalten von Ember.js so zu ändern, dass es keine JavaScript-Prototypen erweitert, wie auf dieser Seite erklärt: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
Ich habe einige Tests durchgeführt, und der Fehler verschwindet, wenn ich die Zeile window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; in die Datei _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js nach der Zeile window.EmberENV.FORCE_JQUERY = true; hinzufüge.
Für diejenigen unter Ihnen, die es ausprobieren möchten, können Sie sich die Seite /tst/index.html auf dem Forum ansehen (möglicherweise benötigen Sie eine europäische IP-Adresse, damit das Skript startet; ich habe keine Ahnung).
Jetzt denke ich, dass Sie alle Informationen haben, die ich Ihnen geben kann.
Also, hier ist meine Frage.
Obwohl dies ein recht spezifischer Fehler ist, ist die DSGVO in Europa immer präsenter, und es wird nicht einfacher werden.
Quantcast befindet sich in einer ziemlich monopolistischen Position, zumindest für Akteure, die sich nicht leisten können, hunderte von Dollar für die Umsetzung der DSGVO auszugeben. Dieser Fehler verhindert jede Nutzung von Quantcast und damit von Werbung auf Discourse in Europa, was für mich ein großes Problem zu sein scheint.
Auch wenn ich den Fehler nur mit Quantcast gefunden habe, kann eine solche Art von Fehler tatsächlich bei vielen Drittanbieter-Skripten auftreten, die wir für Werbung oder andere Zwecke einbetten müssen, über die wir keinerlei Kontrolle haben und die sich auf das „normale“ Verhalten von JavaScript-Objekten wie Array, String und Function verlassen.
Ich kenne den Discourse-Code nicht gut genug, daher frage ich Sie: Werden die von Ember.js hinzugefügten Eigenschaften für Array-, String- und Function-Objekte (siehe den vorherigen Link) von Discourse verwendet oder nicht? Wenn nicht, sollten wir vielleicht erwägen, die Prototyp-Erweiterungen von Ember.js zu deaktivieren, um solche Nebeneffekte zu verhindern?
Ich hoffe, jemand kann mir dazu Informationen geben,
vielen Dank