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

الرمز المستضاف عن بُعد، أو 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 أو مواقع إلكترونية أخرى للعثور على خيارات أخرى تلبي حالات الاستخدام نفسها.

هزّ الأشجار

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

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

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

chrome.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 تريد الحصول على المكتبة import من شبكة توصيل محتوى (CDN)، سيظل عليك تعديلها لتحميلها من مصدر محلي.Y باستخدام أنظمة الإنشاء الحديثة، يمكنك بسهولة إنشاء مكوّنات إضافية لاستخراج مرجع بعيد وتضمينه مباشرةً في الرمز البرمجي.

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

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، يجب إزالته. ولا يهم إذا كان الحساب غير نشط أو غير مستخدَم. وإذا لم يتم استخدامها، يجب إزالتها، إما من خلال عملية Treeshaking أو تعديل المكتبة لإزالتها.

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

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

User Scripts API

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

chrome.debugger

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

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

إطارات iframe في وضع الحماية

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

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

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

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