你好,
这是一个相当具体的 bug,但其影响可能远超这一特定情况,因此我想就此提一个问题。
(另外,我为我的英语道歉,我是法国人,完全不是母语者……)
但首先,让我解释一下背景。
我一直使用 Discourse 运营一个关于树莓派的法语论坛(forum.raspberry-pi.fr)。该论坛使用了广告管理工具(themoneytizer)。正如您可能所知,欧洲要求我们实施 RGPD(通用数据保护条例)以保护用户隐私。在法国,RGPD 同意管理的主要参与者是 Quantcast 及其"Choice"解决方案。
因此,我一直使用 Quantcast 的解决方案有一段时间了,之前没有任何问题,但最近我注意到“全部接受”按钮不再正常工作。点击后没有任何反应,在开发者控制台中我看到如下错误:“Uncaught TypeError: can’t define property “status”: Function is not extensible"。
发生了什么(至少根据我的理解):
请相信,我花了非常非常长的时间才找到问题的根源。显然,ember.js(我对它非常不熟悉)扩展了一些 JavaScript 原生对象,例如 Array、String 和 Function。出于某种原因,它似乎以某种方式阻止了这些对象的扩展(我尚未完全理解这部分)。
Quantcast 的解决方案在其部分尝试扩展一个对象(我推测是一个数组),这可能是 FunctionAcceptAll 函数(这也解释了为什么 bug 仅在点击“全部接受”和“全部拒绝”按钮时出现)。然而,该对象的正常行为已被 ember.js 修改。
在进行了大量研究以理解此 bug 后,我还发现可以修改 Ember.js 的行为,使其不扩展 JavaScript 原型,正如这个页面所解释的:https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/。
我进行了一些测试,如果我在文件 _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js 中的 window.EmberENV.FORCE_JQUERY = true; 行之后添加一行 window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false};,bug 就会消失。
对于那些想要尝试的人,可以查看论坛上的 /tst/index.html 页面(您可能需要一个欧洲 IP 才能让脚本启动,我不确定具体原因)。
现在,我认为我已经提供了所有可能提供的信息。
那么,现在是我的问题。
尽管这是一个相当具体的 bug,但 RGPD 在欧洲越来越普遍,而且未来只会变得更加严格。
Quantcast 处于近乎垄断的地位,至少对于那些无法承担数百美元费用来实施 RGPD 的参与者而言。这个 bug 导致无法在 Discourse 上使用 Quantcast,进而导致在欧洲无法使用广告,这在我看来是一个大问题。
此外,即使我仅在 Quantcast 中发现了这个 bug,这种类型的 bug 实际上可能发生在许多第三方脚本中,这些脚本我们必须嵌入用于广告或其他用途,我们完全无法控制它们,而且它们依赖于 JavaScript 中 Array、String 和 Function 对象的“正常”行为。
我对 Discourse 的代码还不够熟悉,所以我想请教您:Ember.js 添加到 Array、String 和 Function 对象上的属性(参见上面的链接)是否被 Discourse 使用?如果没有,我们是否应该考虑禁用 Ember.js 的原型扩展,以避免出现此类副作用?
希望有人能就此提供信息,
谢谢