الانتقال إلى مساحة اسم المتصفّح

بدءًا من الإصدار 148 من Chrome، ستتوفّر جميع واجهات برمجة التطبيقات الخاصة بإضافات Chrome ضمن مساحة الاسم browser بالإضافة إلى مساحة الاسم الحالية chrome. على سبيل المثال، browser.tabs.create({}) وchrome.tabs.create({}) متكافئتان.

مساحة الاسم متاحة في أي مكان يمكنك فيه استدعاء واجهات برمجة تطبيقات الإضافات، بما في ذلك نصوص المحتوى وبرامج الخدمة والمستندات خارج الشاشة. تشير إلى عناصر واجهة برمجة التطبيقات نفسها التي تشير إليها chrome، لذا chrome.tabs === browser.tabs.

تنتج مساحة الاسم browser عن العمل في مجموعة WebExtensions Community Group (WECG)، وهي مجموعة تابعة لمنتدى W3C يتعاون فيها مورّدو المتصفحات بشأن معايير مشتركة للإضافات. لن تتم إزالة مساحة الاسم chrome، بل ستستمر مساحتا الاسم في العمل.

تحديد ما إذا كنت ستستخدم مساحة اسم المتصفّح أم لا

إذا كنت تستخدم webextension-polyfill، انتقِل إلى ملاحظة لمستخدمي polyfill قبل إجراء أي تغييرات أخرى، لأنّ الإجابة تختلف بالنسبة إليك.

إذا كنت بصدد إنشاء إضافة جديدة، اضبط قيمة minimum_chrome_version على "148" واستخدِم browser بدون شروط، ويمكنك التوقّف عن القراءة هنا. باقي هذا القسم مخصّص للإضافات الحالية التي تريد تحديد كيفية استخدام هذه الميزة.

التحقّق من إصدارات Chrome التي يستخدمها المستخدمون

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

من هناك، اختَر مسارًا:

الاعتماد بدون شروط

اضبط minimum_chrome_version في ملف البيان واستخدِم browser بدون شروط، أي بدون الحاجة إلى حماية أثناء وقت التشغيل:

{
  "minimum_chrome_version": "148"
}

استخدِم ميزة "الطرح على مراحل" عند رفع minimum_chrome_version. في حال حدوث خطأ، يمكنك التراجع عن التحديث في "سوق Chrome الإلكتروني".

استخدام ميزة "الحماية أثناء التشغيل"

أضِف المقتطف التالي في بداية رمز بدء تشغيل الإضافة قبل الإشارة إلى browser في أي مكان آخر:

if (!globalThis.browser) {
  globalThis.browser = chrome;
  // Consider firing an analytics event here to measure how often
  // your users hit this fallback path.
}

وهذا يجعل browser اسمًا مستعارًا لـ chrome في الإصدارات السابقة، وبالتالي يمكن لبقية الرمز البرمجي استخدام browser بدون شروط.

ملاحظة لمستخدمي polyfill

إذا كانت الإضافة تستخدم webextension-polyfill، ستصبح غير نشطة على الإصدار 148 من Chrome والإصدارات الأحدث. تم تخطّي عملية التضمين في رمز polyfill عندما تم تحديد browser، على افتراض أنّ المتصفّح المضيف قد وفّر واجهة برمجة التطبيقات.

تم التراجع عن محاولة سابقة لإصدار مساحة الاسم في الإصدار 136 من Chrome لهذا السبب: مع تعريف browser حديثًا، توقّف التعبئة الاحتياطية عن التضمين، ولكن لم يكن browser.runtime.onMessage في Chrome يتيح بعد استخدام أدوات معالجة الأحداث التي تعرض وعودًا، وهو ما كانت توفّره التعبئة الاحتياطية. وتعطّلت الإضافات التي تعتمد على هذا النمط. يتضمّن الإصدار 148 من Chrome مساحة الاسم وبرامج معالجة الأحداث onMessageالتي تعرض الوعود الأصلية معًا لتجنُّب هذه الفجوة.

يمكنك إزالة تبعية polyfill بعد أن ينتقل قاعدة المستخدمين إلى الإصدار 148 من Chrome.

ميزات أخرى

الردود غير المتزامنة في runtime.sendMessage

في الإصدار 148 من Chrome، يمكن أن تعرض أدوات معالجة runtime.onMessage القيمة Promise مباشرةً لإرسال ردّ غير متزامن. ويعمل ذلك سواء أطلقت عليه اسم chrome.* أو browser.*.

في السابق، كانت الطريقة الوحيدة للرد بشكل غير متزامن هي عرض قيمة ثابتة true من متتبِّع الأحداث واستدعاء sendResponse لاحقًا:

// Old pattern - requires returning true to keep the channel open
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  fetch('https://example.com')
    .then(response => sendResponse({ statusCode: response.status }));

  return true; // keeps the message channel open for the async response
});

يمكنك الآن عرض Promise (أو استخدام الدالة async) مباشرةً:

// New pattern - return a promise or use async/await
browser.runtime.onMessage.addListener(async (message, sender) => {
  const response = await fetch('https://example.com');
  return { statusCode: response.status };
});

سيستمر عمل النمط return true، لذا لن تحتاج إلى تغيير الرمز الحالي.

runtime.onMessage