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

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

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

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

علمتُ أنّ الإضافة تتضمّن RHC. ما هي المشكلة؟

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

كيفية اكتشاف RHC

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

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

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

ماذا لو كنت متشوّقًا للحصول على تحديث للمكتبة؟

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

تدقيق الرمز

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

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

هزة شجرة

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

تعتمد تفاصيل كيفية تنفيذ تشذيب الأشجار على مشروعك المحدد. ولكن لأخذ مثال بسيط باستخدام Rollup، يمكنك إضافة تغيير الأشجار فقط من خلال تجميع التعليمة البرمجية لمشروعك. على سبيل المثال، إذا كان لديك ملف يسجِّل الدخول إلى مصادقة Firebase فقط، باسم رئيسي.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);
  }
});

بعد ذلك، كل ما عليك فعله هو إخبار "5" لملف الإدخال، والمكون الإضافي المطلوب لتحميل ملفات العُقد @rollup/plugin-node-resolve، واسم ملف الإخراج الذي ينشئه.

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

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

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

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

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

هذا يعني أن التعليمة البرمجية المحددة تبدو كما يلي:

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

يمكنك إنشاء مكوّن إضافي صغير لعملية الدمج.

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. ما عليك سوى تعديل الرمز البرمجي المخالف يدويًا، وحفظ ملف الفرق، وتهيئة حزمة التصحيح بالتغييرات التي تريد تطبيقها. يمكنك قراءة برنامج تعليمي كامل على الملف الشخصي للمشروع. إذا كنت تعمل على تصحيح مشروع، ننصحك حقًا بالتواصل مع المشروع لطلب إجراء التغييرات قبل تنفيذه. تجعل حزمة التصحيح إدارة التصحيحات أسهل كثيرًا، إلا أن عدم وجود أي شيء تحتاج إلى تصحيحه هو الأفضل.

ما يجب فعله في حالة عدم استخدام الرمز

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

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

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

واجهة برمجة تطبيقات نصوص المستخدم

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

chrome.debugger

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

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

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

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

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

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

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