التعامل مع مخالفات الرموز المستضافة عن بُعد

الرمز المستضاف عن بُعد، أو RHC، هو الاسم الذي يطلقه "سوق Chrome الإلكتروني" على أي محتوى ينفّذه المتصفّح ويتم تحميله من مكان آخر غير ملفات الإضافة نفسها. أشياء مثل JavaScript وWASM. لا يشمل ذلك البيانات أو عناصر مثل JSON أو CSS.

لماذا لم يعُد مسموحًا باستخدام RHC؟

مع الإصدار Manifest V3، يجب أن تضمّن الإضافات الآن جميع الرموز التي تستخدمها داخل الإضافة نفسها. في السابق، كان بإمكانك إدراج علامات البرامج النصية بشكل ديناميكي من أي عنوان URL على الويب.

قيل لي إنّ إضافتي تتضمّن محتوى ذا صلة بالرعاية الصحية. ما هي المشكلة؟

إذا تم رفض إضافتك أثناء المراجعة بسبب الخطأ Blue Argon، يعني ذلك أنّ المراجعين يعتقدون أنّ إضافتك تستخدم رمزًا برمجيًا مستضافًا عن بُعد. ويحدث ذلك عادةً عندما تحاول إحدى الإضافات إضافة علامة نص برمجي تتضمّن مصدرًا خارجيًا (أي من الويب المفتوح، وليس من الملفات المضمّنة في الإضافة)، أو عندما تحاول جلب مصدر لتنفيذه مباشرةً.

كيفية رصد المحتوى الذي يتم إنشاؤه آليًا

ليس من الصعب رصد المحتوى الذي يتم إنشاؤه بواسطة الذكاء الاصطناعي، ما عليك سوى معرفة ما يجب البحث عنه. أولاً، ابحث عن السلسلتَين "http://‎" أو "https://‎" في مشروعك. إذا كان لديك انتهاك متعلق بالمحتوى الذي تم إنشاؤه آليًا، من المحتمل أن تتمكّن من تحديد موقعه من خلال العثور على هذا المحتوى. إذا كان لديك نظام إنشاء كامل أو كنت تستخدم عناصر خارجية من npm أو مصادر أخرى تابعة لجهات خارجية، تأكَّد من البحث في نسخة الرمز المجمّعة، لأنّ هذا ما سيتم تقييمه من قِبل المتجر. إذا لم تتمكّن من العثور على المشكلة، فإن الخطوة التالية هي التواصل مع فريق الدعم الشامل. وسيكون بإمكانهم تحديد الانتهاكات المحدّدة والإجراءات المطلوبة لنشر الإضافة في أقرب وقت ممكن.

ما يجب فعله إذا كانت إحدى المكتبات تطلب الرمز

وبغض النظر عن مصدر الرمز، لا يُسمح بعرض محتوى مستضاف على منصة أخرى. ويشمل ذلك الرمز الذي لم تكتبه، ولكنك تستخدمه كعنصر تابع في مشروعك. واجه بعض المطوّرين الذين يستخدمون Firebase هذه المشكلة عند تضمين رمز برمجي عن بُعد لاستخدامه في Firebase Auth. على الرغم من أنّ هذه المكتبة كانت تابعة لجهة أولى (أي مملوكة من Google)، لم يتم منح أي استثناء لـ RHC. عليك ضبط الرمز إما لإزالة RHC أو لتعديل مشروعك كي لا يتضمّن الرمز من البداية. إذا واجهت مشكلة ولم يكن الرمز البرمجي الخاص بك هو الذي يحمّل RHC، بل إحدى المكتبات التي تستخدمها، فإنّ أفضل إجراء يمكنك اتّخاذه هو التواصل مع مؤلف المكتبة. أبلِغهم بأنّ هذا يحدث، واطلب منهم إما تقديم حل بديل أو تعديل الرمز البرمجي لإزالة هذه المشكلة.

ماذا لو لم تتمكّن من انتظار تحديث المكتبة؟

سيتم إرسال تحديث لبعض المكتبات فور تلقّي الإشعار، ولكن قد يتم إيقاف مكتبات أخرى أو قد يستغرق حل المشكلة وقتًا. استنادًا إلى ما يحدث في المخالفة المحدّدة، قد لا تحتاج إلى الانتظار إلى أن يتم نقلها إلى حالة "تمت الموافقة" وإكمال مراجعة ناجحة. تتوفّر عدة خيارات لمساعدتك في استعادة حسابك والبدء في استخدامه سريعًا.

تدقيق الرمز البرمجي

هل أنت متأكّد من أنّ الرمز الذي يتسبّب في الطلب مطلوب؟ إذا كان بإمكانك حذف هذا الرمز البرمجي أو إزالة المكتبة التي تتسبّب في حدوث الخطأ، يمكنك حذف الرمز البرمجي، وبذلك تكون قد انتهيت من حلّ المشكلة.

هل هناك مكتبة أخرى تقدّم الميزات نفسها؟ يمكنك تجربة npmjs.com أو GitHub أو مواقع إلكترونية أخرى للعثور على خيارات أخرى تلبي حالات الاستخدام نفسها.

هزّ الأشجار

إذا لم يتم استخدام الرمز الذي يتسبّب في مخالفة سياسة المحتوى المحدود، قد تتمكّن الأدوات من حذفه تلقائيًا. تتضمّن أدوات الإنشاء الحديثة، مثل webpack وRollup وVite (على سبيل المثال لا الحصر)، ميزة تُعرف باسم tree-shaking. بعد تفعيل ميزة "إزالة الرموز البرمجية غير المستخدَمة" في نظام التصميم، من المفترض أن تزيل هذه الميزة أي مسارات رموز برمجية غير مستخدَمة. وهذا يعني أنّه لن يتوفّر لديك إصدار متوافق من الرمز فحسب، بل إصدار أكثر فعالية وأسرع أيضًا. يُرجى العِلم أنّه لا يمكن إجراء عملية Tree Shaking لبعض المكتبات، ولكن يمكن إجراؤها للعديد منها. تتضمّن بعض الأدوات، مثل Rollup وVite، ميزة tree-shaking مفعّلة تلقائيًا، بينما يجب إعداد webpack لتفعيلها. إذا كنت لا تستخدم نظام إنشاء كجزء من إضافتك، ولكنك تستخدم مكتبات الرموز البرمجية، ننصحك بشدة بالبحث عن إمكانية إضافة أداة إنشاء إلى سير عملك. تساعدك أدوات الإنشاء في كتابة مشاريع أكثر أمانًا وموثوقية وأسهل صيانة.

تختلف تفاصيل كيفية تنفيذ عملية إزالة الرموز غير المستخدَمة حسب مشروعك. ولكن لنأخذ مثالاً بسيطًا مع Rollup، يمكنك إضافة treeshaking بمجرّد تجميع رمز مشروعك. على سبيل المثال، إذا كان لديك ملف يسجّل الدخول فقط إلى Firebase Auth، واسمه main.js، يمكنك إجراء ما يلي:

import { GoogleAuthProvider, initializeAuth } from "firebase/auth";

browser.identity.getAuthToken({ 'interactive': true }, async (token) => {
  const credential = GoogleAuthProvider.credential(null, token);
  try {
    const app = initializeApp({ ... });
    const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence });
    const { user } = await auth.signInWithCredential(credential)
    console.log(user)
  } catch (e) {
    console.error(error);
  }
});

بعد ذلك، ما عليك سوى إخبار Rollup بملف الإدخال والمكوّن الإضافي المطلوب لتحميل ملفات Node ‎@rollup/plugin-node-resolve واسم ملف الإخراج الذي يتم إنشاؤه.

npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js

عند تنفيذ هذا الأمر في نافذة طرفية، ستتلقّى نسخة من ملف main.js تم إنشاؤها، وتم تجميعها كلها في ملف واحد باسم compiled.js.

يمكن أن تكون عملية التجميع بسيطة، ولكن يمكن أيضًا ضبطها بشكل كبير. يمكنك إضافة جميع أنواع الإعدادات والمنطق المعقّد، ما عليك سوى الاطّلاع على المستندات. سيؤدي استخدام أدوات إنشاء مثل هذه إلى الحصول على رمز أصغر حجمًا وأكثر فعالية، وفي هذه الحالة، سيحلّ مشكلة الرمز المستضاف عن بُعد.

تعديل الملفات تلقائيًا

من الطرق الشائعة بشكل متزايد التي يمكن أن يدخل بها الرمز المستضاف عن بُعد إلى قاعدة الرموز البرمجية، أن يكون تابعًا لمكتبة مضمّنة. إذا أرادت المكتبة X استيراد المكتبة Yimport من شبكة توصيل محتوى، سيظل عليك تعديلها لتحميلها من مصدر محلي. باستخدام أنظمة الإنشاء الحديثة، يمكنك بسهولة إنشاء مكوّنات إضافية لاستخراج مرجع خارجي وتضمينه مباشرةً في الرمز البرمجي.

هذا يعني أنّه سيتم عرض الرمز التالي:

import moment from "https://unpkg.com/moment@2.29.4/moment.js"
console.log(moment())

يمكنك إنشاء إضافة صغيرة لبرنامج Rollup.

import { existsSync } from 'fs';
import fetch from 'node-fetch';

export default {
  plugins: [{
    load: async function transform(id, options, outputOptions) {
      // this code runs over all of out javascript, so we check every import
      // to see if it resolves as a local file, if that fails, we grab it from
      // the network using fetch, and return the contents of that file directly inline
      if (!existsSync(id)) {
        const response = await fetch(id);
        const code = await response.text();

        return code
      }
      return null
    }
  }]
};

بعد تشغيل الإصدار باستخدام المكوّن الإضافي الجديد، سيتم رصد كل عنوان URL بعيد import بغض النظر عمّا إذا كان الرمز البرمجي خاصًا بنا أو كان عبارة عن تبعية فرعية أو تبعية فرعية ثانوية أو أي شيء آخر.

npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js

تعديل الملفات يدويًا

أبسط خيار هو حذف الرمز البرمجي الذي يتسبّب في ظهور RHC. افتح الملف في محرّر النصوص الذي تختاره، واحذف الأسطر المخالفة. لا يُنصح بذلك بشكل عام، لأنّها طريقة غير آمنة وقد تُنسى. ويصعّب ذلك عملية صيانة مشروعك عندما يكون الملف المسمّى "library.min.js" ليس في الواقع library.min.js. بدلاً من تعديل الملفات الأولية، يمكنك استخدام أداة مثل patch-package، ما يتيح لك إجراء التعديلات بشكل أسهل. هذا خيار فعّال جدًا يتيح لك حفظ التعديلات على ملف بدلاً من حفظ الملف نفسه. وهي تستند إلى ملفات التصحيح، وهي النوع نفسه من الملفات التي تستخدمها أنظمة التحكّم في الإصدارات، مثل Git أو Subversion. كل ما عليك فعله هو تعديل الرمز البرمجي المخالف يدويًا، وحفظ ملف الاختلاف، وضبط patch-package باستخدام التغييرات التي تريد تطبيقها. يمكنك الاطّلاع على برنامج تعليمي كامل في ملف Readme الخاص بالمشروع. إذا كنت تعمل على تصحيح مشروع، ننصحك بشدة بالتواصل مع فريق المشروع وطلب إجراء التغييرات في المصدر. على الرغم من أنّ حزمة patch-package تسهّل كثيرًا إدارة التصحيحات، إلا أنّه من الأفضل ألا تحتاج إلى أي تصحيح.

ما يجب فعله إذا لم يتم استخدام الرمز

مع زيادة حجم قواعد الرموز البرمجية، يمكن أن تحتفظ التبعيات (أو التبعية الخاصة بالتبعية، أو التبعية الخاصة بـ…) بمسارات الرموز البرمجية التي لم يعُد يتم استخدامها. إذا كان أحد هذه الأقسام يتضمّن رمزًا لتحميل أو تنفيذ RHC، يجب إزالته. ولا يهمّ ما إذا كان الجهاز غير نشط أو غير مستخدَم. إذا لم يتم استخدامها، يجب إزالتها، إما من خلال عملية تقليل حجم الرمز البرمجي أو تعديل المكتبة لإزالتها.

هل هناك أي حلّ بديل؟

بشكل عام، لا يُسمح باستخدام RHC. ومع ذلك، هناك عدد قليل من الحالات التي يُسمح فيها بذلك. ويكون ذلك في الحالات التي يستحيل فيها استخدام أي خيار آخر.

User Scripts API

نصوص المستخدمين البرمجية هي مقتطفات صغيرة من الرموز البرمجية يقدّمها المستخدم عادةً، وهي مخصّصة لأدوات إدارة نصوص المستخدمين البرمجية، مثل TamperMonkey وViolentmonkey. ولا يمكن لهؤلاء المدراء تجميع الرموز التي يكتبها المستخدمون، لذا توفّر واجهة برمجة التطبيقات User Script API طريقة لتنفيذ الرموز التي يقدّمها المستخدم. لا يحلّ هذا الإذن محلّ browser.scripting.executeScript أو بيئات تنفيذ الرموز البرمجية الأخرى. يجب أن يفعّل المستخدمون وضع مطور البرامج لتنفيذ أي إجراء. إذا رأى فريق المراجعة في "سوق Chrome الإلكتروني" أنّ هذا الخيار يُستخدَم بطريقة مختلفة عن الغرض المخصّص له (أي الرمز الذي يقدّمه المستخدم)، قد يتم رفض الإضافة أو إزالتها من السوق.

browser.debugger

تتيح واجهة برمجة التطبيقات browser.debugger للإضافات إمكانية التفاعل مع بروتوكول أدوات مطوّري البرامج في Chrome. وهو البروتوكول نفسه المستخدَم في أدوات مطوّري البرامج في Chrome وعدد كبير من الأدوات الأخرى. باستخدامها، يمكن لأي إضافة طلب وتنفيذ رمز برمجي عن بُعد. وكما هو الحال مع نصوص المستخدمين، لا يشكّل هذا الخيار بديلاً عن browser.scripting، كما أنّه يوفّر تجربة مستخدم أفضل بكثير. أثناء استخدامها، سيظهر للمستخدم شريط تحذير في أعلى النافذة. إذا تم إغلاق البانر أو رفضه، سيتم إنهاء جلسة تصحيح الأخطاء.

لقطة شاشة لشريط العناوين في Chrome يعرض الرسالة "بدأت إضافة تصحيح الأخطاء في تصحيح أخطاء هذا المتصفّح"
لقطة شاشة لشريط العناوين في Chrome يعرض الرسالة "بدأت إضافة تصحيح الأخطاء في تصحيح أخطاء هذا المتصفّح"

إطارات iframe المحصورة

إذا كنت بحاجة إلى تقييم سلسلة كرمز، وكنت في بيئة DOM (مثل نص برمجي للمحتوى، بدلاً من مشغّل خدمات إضافة)، يمكنك استخدام إطار iframe محمي. لا تتوافق الإضافات تلقائيًا مع ميزات مثل eval() كإجراء وقائي. قد يعرّض الرمز البرمجي الضار سلامة المستخدمين وأمانهم للخطر. ولكن عندما لا يتم تنفيذ الرمز إلا في بيئة آمنة معروفة، مثل إطار iframe محمي من بقية الويب، تنخفض هذه المخاطر بشكل كبير. في هذا السياق، يمكن إلغاء "سياسة أمان المحتوى" التي تحظر استخدام eval، ما يتيح لك تشغيل أي رمز JavaScript صالح.

إذا كانت لديك حالة استخدام غير مشمولة، يمكنك التواصل مع الفريق باستخدام القائمة البريدية chromium-extensions للحصول على ملاحظات، أو فتح تذكرة جديدة لطلب إرشادات من فريق الدعم الشامل.

ما يجب فعله في حال عدم الموافقة على حكم

يمكن أن يكون تطبيق السياسات دقيقًا، وتتضمّن المراجعة إدخال بيانات يدويًا، ما يعني أنّ فريق "سوق Chrome الإلكتروني" قد يوافق أحيانًا على تغيير قرار المراجعة. إذا كنت تعتقد أنّه تم ارتكاب خطأ أثناء المراجعة، يمكنك تقديم طلب بإعادة النظر في قرار الرفض باستخدام خدمة الدعم الشامل.