Olá,
este é um bug bastante específico, mas seu impacto pode ir muito além deste caso em particular, então tenho uma pergunta sobre isso.
(Também peço desculpas pelo meu inglês; sou francês, então não sou falante nativo de forma alguma…)
Mas, antes, deixe-me explicar o contexto.
Uso o Discourse há algum tempo para um fórum em francês sobre o Raspberry Pi (forum.raspberry-pi.fr). Este fórum utiliza gerenciamento de publicidade (themoneytizer). Como você provavelmente sabe, a Europa nos obriga a implementar o RGPD para proteção da privacidade dos usuários. O principal ator (pelo menos na França) para consentimento do RGPD é a Quantcast e sua solução “Choice”.
Então, tenho usado a solução da Quantcast há bastante tempo, sem problemas, até recentemente, quando percebi que o botão “Aceitar tudo” não está funcionando corretamente mais. Ao clicar, nada acontece e, ao verificar no console de desenvolvedor, obtenho este erro: “Uncaught TypeError: can’t define property “status”: Function is not extensible”.
O que acontece (pelo menos, até onde entendo):
Acredite em mim quando digo que me levou muito, muito tempo para encontrar a origem do problema. Aparentemente, o Ember.js (com o qual não tenho muita familiaridade) estende alguns objetos nativos do JavaScript, como Array, String e Function. E, por algum motivo, também parece impedir de alguma forma a extensão desses objetos (ainda não entendi completamente essa parte).
A solução da Quantcast, por sua vez, tenta — provavelmente na função FunctionAcceptAll (o que explica o bug ocorrer apenas ao clicar no botão “Aceitar tudo” e no botão “Rejeitar tudo”) — estender um objeto, presumo que um array, cujo comportamento normal foi modificado pelo Ember.js.
Após muita pesquisa para entender esse bug, também descobri que é possível modificar o comportamento do Ember.js para não estender os protótipos do JavaScript, conforme explicado nesta página: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
Fiz alguns testes e o bug desaparece se eu adicionar a linha window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; no arquivo _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js, logo após a linha window.EmberENV.FORCE_JQUERY = true;.
Para aqueles de vocês que quiserem testar, podem verificar a página /tst/index.html no fórum (talvez seja necessário um IP europeu para que o script inicie; não tenho certeza).
Agora, acho que tenho todas as informações que posso fornecer.
Agora, aqui está minha pergunta:
Embora este seja um bug bastante específico, o RGPD está cada vez mais presente na Europa atualmente, e a situação não vai ficar mais fácil.
A Quantcast ocupa uma posição bastante monopolística, pelo menos para atores que não podem pagar centenas de dólares para implementar o RGPD. Este bug impede qualquer uso da Quantcast e, consequentemente, de publicidade no Discourse na Europa, o que, para mim, parece ser um grande problema.
Além disso, mesmo que eu tenha encontrado o bug apenas usando a Quantcast, esse tipo de problema pode realmente acontecer com muitos scripts de terceiros que precisamos incorporar para anúncios ou outros fins, sobre os quais não temos nenhum controle e que dependem do comportamento “normal” do JavaScript para os objetos Array, String e Function.
Não conheço o código do Discourse o suficiente, então estou perguntando a vocês: as propriedades adicionadas pelo Ember.js aos objetos Array, String e Function (veja o link acima) são usadas pelo Discourse ou não? Se não, talvez devêssemos considerar desativar as extensões de protótipo do Ember.js, a fim de evitar efeitos colaterais como este?
Espero que alguém possa me dar informações sobre isso.
Obrigado.