Ciao,
quindi questo è un bug piuttosto specifico, ma il suo impatto potrebbe andare ben oltre questo caso particolare, quindi ho una domanda al riguardo.
(Anche, mi scuso per il mio inglese, sono francese, quindi non sono affatto un madrelingua…)
Ma prima, lasciatemi spiegare il contesto.
Utilizzo Discourse da un po’ di tempo per un forum francese sul Raspberry Pi (forum.raspberry-pi.fr). Questo forum utilizza la gestione della pubblicità (themoneytizer). Come probabilmente sapete, l’Europa ci obbliga a implementare il RGPD per la protezione della privacy degli utenti. Il principale attore (almeno in Francia) per il consenso RGPD è Quantcast e la loro soluzione “Choice”.
Quindi, ho utilizzato la soluzione di Quantcast per un bel po’ di tempo, senza problemi, fino a quando recentemente non ho notato che il pulsante “Accetta tutto” non funziona più correttamente. Al clic, non succede nulla e guardando nella console degli sviluppatori ho ottenuto questo errore: “Uncaught TypeError: can’t define property “status”: Function is not extensible”.
Cosa succede (almeno per quanto ho capito io):
Fidatevi quando dico che mi ci è voluto un bel po’ di tempo per trovare la fonte del problema. A quanto pare, Ember.js (con cui non sono molto familiare) estende alcuni oggetti nativi di JavaScript, come Array, String e Function. E per qualche motivo sembra anche impedire in qualche modo l’estensione di questi oggetti in un certo modo (non ho ancora capito completamente questa parte).
La soluzione di Quantcast, da parte sua, cerca, probabilmente nella funzione FunctionAcceptAll (spiegando perché il bug si verifica solo quando si clicca sul pulsante “accetta tutto” e sul pulsante “rifiuta tutto”), di estendere un oggetto, presumo un array, il cui comportamento normale è stato modificato da Ember.js.
Dopo molte ricerche per comprendere questo bug, ho anche scoperto che è possibile modificare il comportamento di Ember.js per non estendere i prototipi di JavaScript, come spiegato in questa pagina https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
Ho fatto alcuni test e il bug scompare se aggiungo la riga window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; nel file _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js dopo la riga window.EmberENV.FORCE_JQUERY = true;.
Per coloro che volessero provare, potete dare un’occhiata alla pagina /tst/index.html sul forum (potrebbe essere necessario un IP europeo affinché lo script venga avviato, non ne ho idea).
Ora, penso di avervi fornito tutte le informazioni possibili.
Quindi, ora ecco la mia domanda.
Anche se questo è un bug piuttosto specifico, il RGPD è sempre più presente in Europa in questo momento e non diventerà più facile.
Quantcast è in una posizione quasi monopolistica, almeno per gli attori che non possono permettersi di pagare centinaia di dollari per implementare il RGPD. Questo bug impedisce qualsiasi utilizzo di Quantcast, e quindi della pubblicità su Discourse in Europa, che mi sembra un grosso problema.
Inoltre, anche se ho trovato il bug solo usando Quantcast, questo tipo di bug potrebbe effettivamente verificarsi per molti script di terze parti che dobbiamo incorporare per la pubblicità o altro, sui quali non abbiamo alcun controllo e che fanno affidamento sul comportamento “normale” di JavaScript per gli oggetti Array, String e Function.
Non conosco abbastanza il codice di Discourse, quindi vi chiedo: le proprietà aggiunte da Ember.js agli oggetti Array, String e Function (vedi il link sopra) sono utilizzate da Discourse o no? Se non lo sono, forse dovremmo considerare di disabilitare le estensioni dei prototipi da Ember.js, per prevenire effetti collaterali come questo?
Spero che qualcuno possa darmi informazioni a riguardo,
grazie