बैकग्राउंड स्क्रिप्ट वाले इवेंट मैनेज करना

एक्सटेंशन, इवेंट पर आधारित प्रोग्राम होते हैं. इनका इस्तेमाल Chrome के ब्राउज़िंग अनुभव में बदलाव करने या उसे बेहतर बनाने के लिए किया जाता है. इवेंट ब्राउज़र ट्रिगर होते हैं, जैसे कि किसी नए पेज पर नेविगेट करना, बुकमार्क हटाना या किसी टैब को बंद करना. एक्सटेंशन, इन इवेंट को अपनी बैकग्राउंड स्क्रिप्ट में मॉनिटर करते हैं. इसके बाद, तय किए गए निर्देशों के साथ काम करते हैं.

ज़रूरत पड़ने पर, बैकग्राउंड पेज लोड किया जाता है और कुछ समय से इस्तेमाल में न होने पर, अनलोड हो जाता है. इवेंट के कुछ उदाहरणों में ये शामिल हैं:

  • एक्सटेंशन को पहले इंस्टॉल किया जाता है या नए वर्शन में अपडेट किया जाता है.
  • बैकग्राउंड पेज किसी इवेंट के बारे में सुन रहा था और इवेंट को भेज दिया गया है.
  • कॉन्टेंट स्क्रिप्ट या कोई दूसरा एक्सटेंशन मैसेज भेजता है.
  • एक्सटेंशन का कोई दूसरा व्यू, जैसे कि पॉप-अप से runtime.getBackgroundPage को कॉल करता है.

लोड होने के बाद, बैकग्राउंड पेज तब तक चलता रहेगा, जब तक वह कोई कार्रवाई करता रहेगा. जैसे, Chrome API को कॉल करना या नेटवर्क के लिए अनुरोध करना. इसके अलावा, बैकग्राउंड पेज तब तक अनलोड नहीं होगा, जब तक कि दिखने वाले सभी व्यू और सभी मैसेज पोर्ट बंद नहीं हो जाते. ध्यान दें कि व्यू खोलने से इवेंट पेज लोड नहीं होता. हालांकि, यह सिर्फ़ लोड होने पर बंद होने से रोकता है.

असरदार बैकग्राउंड स्क्रिप्ट तब तक कोई गतिविधि नहीं करती हैं, जब तक वे आग लगने की स्थिति को सुन नहीं रही होती हैं. इसके बाद, खास निर्देशों के मुताबिक प्रतिक्रिया देती हैं और फिर अनलोड करती हैं.

बैकग्राउंड स्क्रिप्ट रजिस्टर करें

बैकग्राउंड स्क्रिप्ट, "background" फ़ील्ड के अंदर मेनिफ़ेस्ट में रजिस्टर की जाती हैं. उन्हें "scripts" कुंजी के बाद कलेक्शन में लिस्ट किया जाता है और "persistent" को 'गलत' के तौर पर दिखाया जाना चाहिए.

{
  "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 इवेंट का इस्तेमाल करके देखें. ऐसा इसलिए, क्योंकि Tab API में फ़िल्टर काम नहीं करते.

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 API का इस्तेमाल करें.

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 पर भरोसा करने के बजाय, स्थायी डेटा को प्राथमिकता दी जानी चाहिए. इससे उतनी बार क्लीनअप करने की अनुमति नहीं मिलती जितना ज़रूरी है. साथ ही, कार हादसे के बाद भी इससे मदद नहीं मिलेगी.