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

एक्सटेंशन, इवेंट पर आधारित प्रोग्राम होते हैं. इनका इस्तेमाल 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 एपीआई का इस्तेमाल करें.

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