こんにちは、
これは非常に特定のバグですが、その影響はこの特定のケースを超えて広がる可能性があります。そのため、これについて質問があります。
(また、英語が拙いことをお詫びします。私はフランス人であり、ネイティブスピーカーではありません…)
まず、背景を説明させてください。
私はフランス語のラズベリーパイに関するフォーラム(forum.raspberry-pi.fr)で、しばらくDiscourseを利用しています。このフォーラムでは広告管理(themoneytizer)を使用しています。ご存知の通り、欧州ではユーザーのプライバシー保護のためにGDPR(欧州一般データ保護規則)の実装が義務付けられています。GDPR同意の主要な事業者(少なくともフランスでは)はQuantcastとその「Choice」ソリューションです。
そのため、私は以前からQuantcastのソリューションを使用しており、特に問題はありませんでしたが、最近「すべて同意」ボタンが正常に動作しなくなっていることに気づきました。クリックしても何も起こらず、開発者コンソールを確認すると以下のエラーが表示されました:「Uncaught TypeError: can’t define property “status”: Function is not extensible」。
私の理解する限り、何が起きているかというと:
この問題の根源を見つけるのに、信じられないほど長い時間がかかりました。どうやら、私があまり詳しくないEmber.jsが、Array、String、FunctionといったJavaScriptのネイティブオブジェクトを拡張しているようです。そして、何らかの理由で、これらのオブジェクトの拡張をある程度阻止しているように見えます(この部分はまだ完全に理解できていません)。
一方、Quantcastのソリューションは、おそらくFunctionAcceptAllという関数(このバグが「すべて同意」ボタンと「すべて拒否」ボタンのクリック時のみ発生する理由)で、オブジェクト(おそらく配列)を拡張しようとしています。しかし、そのオブジェクトの通常の動作はEmber.jsによって変更されているようです。
このバグを理解するための多くの調査の結果、Ember.jsの動作を変更してJavaScriptのプロトタイプを拡張しないようにすることが可能であることもわかりました。詳しくは以下のページをご覧ください:https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/
いくつかテストを行ってみたところ、window.EmberENV.FORCE_JQUERY = true; の行の後に window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; という行をファイル _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js に追加すると、バグが消えました。
試してみたい方のために、フォーラムの /tst/index.html ページをご覧ください(スクリプトが開始するにはヨーロッパのIPアドレスが必要かもしれません。私はわかりません)。
これで、私が提供できる情報はすべて揃ったと思います。
さて、ここが私の質問です。
このバグは非常に特定のケースですが、GDPRは現在ヨーロッパでますます普及しており、今後も簡単にはならないでしょう。
Quantcastは、GDPRの実装に数百ドルを支払う余裕がない事業者にとって、少なくともある程度独占的な地位にあります。このバグにより、Quantcastのあらゆる使用が不可能となり、結果としてヨーロッパにおけるDiscourseでの広告運用が阻害されます。これは大きな問題だと考えています。
また、私がこのバグをQuantcastで発見しただけであっても、広告やその他の目的で埋め込む必要がある多くのサードパーティスクリプト(これらは完全に制御不能であり、Array、String、Functionオブジェクトの「通常の」JavaScript動作に依存しています)でも同様のバグが発生する可能性があります。
Discourseのコードについては十分に理解していないため、お伺いします。Ember.jsがArray、String、Functionオブジェクトに追加するプロパティ(前述のリンク参照)は、Discourseで使用されていますか?もし使用されていないなら、このような副作用を防ぐために、Ember.jsのプロトタイプ拡張を無効にすることを検討すべきではないでしょうか?
どなたかこの件について情報をお寄せいただければ幸いです。
ありがとうございます。