مرحبًا،
هذه مشكلة محددة جدًا، لكن تأثيرها قد يمتد إلى ما هو أبعد من هذه الحالة المحددة، لذا لدي سؤال بخصوصها.
(أيضًا، أعتذر عن لغتي الإنجليزية؛ أنا فرنسي، لذا لست متحدثًا أصليًا على الإطلاق…)
ولكن أولًا، دعني أشرح السياق.
أستخدم منصة Discourse منذ فترة لإدارة منتدى فرنسي حول راسبيري باي (forum.raspberry-pi.fr). يستخدم هذا المنتدى نظام إدارة الإعلانات (themoneytizer). وكما تعلمون على الأرجح، فإن القوانين الأوروبية تلزمنا بتنفيذ لائحة حماية البيانات العامة (RGPD) لحماية خصوصية المستخدمين. والجهة الفاعلة الرئيسية (على الأقل في فرنسا) في مجال موافقة RGPD هي شركة Quantcast وحلها المسمى “Choice”.
لذا، كنت أستخدم حل Quantcast منذ فترة طويلة دون أي مشاكل، حتى لاحظت مؤخرًا أن زر “قبول الكل” لا يعمل بشكل صحيح بعد الآن. عند النقر عليه، لا يحدث شيء، وعند فحص وحدة التحكم للمطورين (dev console) ظهر هذا الخطأ: “Uncaught TypeError: can’t define property “status”: Function is not extensible”.
ما يحدث (على الأقل حسب فهمي):
ثقوا بي عندما أقول إن الأمر استغرق مني وقتًا طويلاً جدًا جدًا لإيجاد مصدر المشكلة. يبدو أن مكتبة ember.js (التي لست على دراية جيدة بها) تقوم بتمديد بعض الكائنات الأصلية في JavaScript، مثل Array و String و Function. وبسبب سبب ما، يبدو أنها تمنع أيضًا تمديد هذه الكائنات بطريقة ما (لم أفهم هذا الجزء بالكامل بعد).
من جانبه، يحاول حل Quantcast، ربما في الدالة FunctionAcceptAll (مما يفسر أن الخطأ يحدث فقط عند النقر على زر قبول الكل أو رفض الكل)، تمديد كائن، أفترض أنه مصفوفة، وقد تغير سلوكه الطبيعي بسبب ember.js.
بعد الكثير من البحث لفهم هذه المشكلة، اكتشفت أيضًا أنه من الممكن تعديل سلوك Ember.js لعدم تمديد بروتوتيبات JavaScript، كما هو موضح في هذه الصفحة: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.
أجريت بعض الاختبارات، وتختفي المشكلة إذا أضفت السطر window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; في الملف _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js بعد السطر window.EmberENV.FORCE_JQUERY = true;.
لأولئك منكم الذين يرغبون في تجربة ذلك، يمكنكم زيارة صفحة /tst/index.html على المنتدى (قد تحتاجون إلى عنوان IP أوروبي لبدء تشغيل السكربت، ليس لدي أي فكرة عن السبب).
الآن، أعتقد أن لديكم جميع المعلومات التي يمكنني تقديمها.
إذن، ها هو سؤالي الآن.
على الرغم من أن هذه مشكلة محددة جدًا، إلا أن لائحة RGPD أصبحت أكثر حضورًا في أوروبا حاليًا، ولن يصبح الأمر أسهل في المستقبل.
تتمتع شركة Quantcast بموقف شبه احتكاري، على الأقل بالنسبة للجهات التي لا تستطيع دفع مئات الدولارات لتنفيذ RGPD. تمنع هذه المشكلة أي استخدام لـ Quantcast، وبالتالي أي استخدام للإعلانات على Discourse في أوروبا، وهو ما يبدو لي مشكلة كبيرة.
أيضًا، حتى لو اكتشفت هذه المشكلة باستخدام Quantcast فقط، فقد تحدث مثل هذه الأخطاء مع العديد من السكربتات الخارجية التي يجب تضمينها للإعلانات أو لأغراض أخرى، والتي لا نملك أي سيطرة عليها، وتعتمد على السلوك “العادي” لـ JavaScript لكائنات Array و String و Function.
لا أعرف كود Discourse بما يكفي، لذا أوجه إليكم السؤال: هل الخصائص التي أضافتها ember.js على كائنات Array و String و Function (انظر الرابط السابق) مستخدمة في Discourse أم لا؟ إذا لم تكن مستخدمة، ربما يجب علينا النظر في تعطيل تمديد البروتوتيبات من ember.js لمنع آثار جانبية مثل هذه؟
آمل أن يتمكن شخص ما من تزويدي بمعلومات حول هذا الأمر،
شكرًا لكم