إدارة الأحداث باستخدام النصوص البرمجية في الخلفية

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

يتم تحميل صفحة الخلفية عند الحاجة إليها، ويتم إلغاء تحميلها عندما تصبح في وضع عدم النشاط. تتضمن بعض الأمثلة على الأحداث ما يلي:

  • يتم تثبيت الإضافة أولاً أو تحديثها إلى إصدار جديد.
  • كانت صفحة الخلفية تطلب الاستماع إلى حدث ما، وتم نقل الحدث.
  • يعمل النص البرمجي للمحتوى أو الإضافات الأخرى على إرسال رسالة.
  • هناك عرض آخر في الإضافة، مثل نافذة منبثقة، يستدعي runtime.getBackgroundPage.

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

وتبقى النصوص البرمجية الفعّالة في الخلفية غير نشِطة إلى أن يتم رصد الأحداث التي تنتظر اندلاع حريق، ثم تتفاعل مع التعليمات المحدّدة، ثم تفرغ التحميل.

تسجيل النصوص البرمجية للخلفية

يتم تسجيل النصوص البرمجية للخلفية في البيان ضمن حقل "background". ويتم إدراجها في صفيف بعد المفتاح "scripts"، ويجب تحديد "persistent" على أنّه false.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

يمكن تسجيل نصوص برمجية متعددة للخلفية للحصول على رمز مقسَّم إلى وحدات.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

إذا كانت إحدى الإضافات تستخدم حاليًا صفحة خلفية دائمة، يمكنك الرجوع إلى دليل نقل البيانات في الخلفية للحصول على تعليمات حول كيفية التبديل إلى نموذج غير دائم.

إعداد الإضافة

استمِع إلى حدث runtime.onInstalled لإعداد إضافة عند التثبيت. يمكنك استخدام هذا الحدث لتحديد حالة أو إعداد لمرة واحدة، مثل قائمة السياق.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

إعداد أدوات معالجة الأحداث

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

يجب تسجيل أدوات الاستماع بشكل متزامن من بداية الصفحة.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

لا تسجِّل المستمعين بشكل غير متزامن، لأنّه لن يتم تشغيلهم بشكل صحيح.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

يمكن للإضافات إزالة المستمعين من النصوص البرمجية للخلفية من خلال الاتصال بـ removeListener. إذا تمت إزالة جميع المستمعين إلى حدث معيّن، لن يُحمِّل Chrome النص البرمجي للخلفية للإضافة في هذا الحدث بعد ذلك.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

فلترة الأحداث

استخدِم واجهات برمجة التطبيقات التي تتيح فلاتر الأحداث لحصر المستمعين بالحالات التي تهم الإضافة. إذا كانت إحدى الإضافات تستمع إلى حدث tabs.onUpdated، جرِّب استخدام حدث webNavigation.onCompleted مع الفلاتر بدلاً من ذلك، لأنّ واجهة برمجة تطبيقات علامات التبويب لا تتيح الفلاتر.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

التفاعل مع المستمعين

تتوفّر أدوات معالجة الحدث لتشغيل الوظائف بعد تنشيط الحدث. للتفاعل مع حدث ما، قم بهيكلة التفاعل المطلوب داخل حدث المستمع.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

إلغاء تحميل النصوص البرمجية للخلفية

يجب الاحتفاظ بالبيانات بشكل دوري حتى لا يتم فقدان المعلومات المهمة في حال تعطُّل إحدى الإضافات بدون تلقّي onSuspend. يمكنك استخدام واجهة برمجة التطبيقات storage للمساعدة في ذلك.

chrome.storage.local.set({variable: variableInformation});

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

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

يمكن ملاحظة عمر النص البرمجي للخلفية من خلال مراقبة ظهور إدخال للإضافة واختفائه من إدارة المهام في Chrome.

ALT_TEXT_HERE

افتح "إدارة المهام" بالنقر على قائمة Chrome وتمرير مؤشر الماوس فوق المزيد من الأدوات واختيار "إدارة المهام".

يتم إلغاء تحميل النصوص البرمجية في الخلفية من تلقاء نفسها بعد بضع ثوانٍ من عدم النشاط. وإذا احتجت إلى تنظيف في اللحظة الأخيرة، استمِع إلى حدث runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

ومع ذلك، يجب تفضيل البيانات المستمرة على الاعتماد على runtime.onSuspend. فهو لا يسمح بإجراء أكبر قدر ممكن من التنظيف ولن يساعد في حالة حدوث عطل.