ब्लॉक किए गए वेब अनुरोध लिसनर को बदलें

मेनिफ़ेस्ट V3 में नेटवर्क के अनुरोधों में बदलाव किया जा रहा है

मेनिफ़ेस्ट V3 एक्सटेंशन, नेटवर्क अनुरोधों में बदलाव को मैनेज करने का तरीका बदलता है. नेटवर्क अनुरोधों को रोकने और chrome.webRequest के साथ रनटाइम के दौरान उनमें बदलाव करने के बजाय, आपका एक्सटेंशन ऐसे नियमों की जानकारी देता है जो तय की गई शर्तों के पूरा होने पर की जाने वाली कार्रवाइयों के बारे में बताते हैं. ऐसा करने के लिए, घोषणात्मक नेट अनुरोध एपीआई का इस्तेमाल करें.

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

मेनिफ़ेस्ट V2 में, वेब अनुरोधों को ब्लॉक करने से, एक्सटेंशन और उन पेजों की परफ़ॉर्मेंस, दोनों पर बुरा असर पड़ सकता है जिन पर वे काम करते हैं. webRequest नेमस्पेस, ब्लॉक करने वाले नौ इवेंट के साथ काम करता है. हर इवेंट को जितनी संख्या में इवेंट हैंडलर की ज़रूरत होती है उसकी संख्या तय होती है. मामलों को बदतर करने के लिए, प्रत्येक वेब पेज को संभावित रूप से कई एक्सटेंशन द्वारा अवरोधित कर दिया जाता है और इसके लिए आवश्यक अनुमतियां आक्रामक होती हैं. मेनिफ़ेस्ट V3, कॉलबैक की जगह डिक्लेरेटिव रूल इस्तेमाल करके, इस समस्या से सुरक्षा देता है.

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

अनुमतियां अपडेट करें

अपने manifest.json के "permissions" फ़ील्ड में ये बदलाव करें.

  • अगर आपको नेटवर्क अनुरोधों की निगरानी नहीं करनी है, तो "webRequest" अनुमति को हटा दें.
  • मैच पैटर्न को "permissions" से "host_permissions" में ले जाएं.

आपको अपनी ज़रूरत के हिसाब से, अन्य अनुमतियां देनी होंगी. इन अनुमतियों के बारे में इस्तेमाल के उदाहरण में बताया गया है.

डिक्लेरेटिव नेट अनुरोध नियम बनाएं

डिक्लेरेटिव नेट अनुरोध नियम बनाने के लिए, अपने manifest.json में "declarative_net_request" ऑब्जेक्ट जोड़ना ज़रूरी है. "declarative_net_request" ब्लॉक में "rule_resource" ऑब्जेक्ट का कलेक्शन होता है, जो किसी नियम फ़ाइल पर ले जाता है. नियम फ़ाइल में ऑब्जेक्ट का कलेक्शन होता है. इसमें, किसी कार्रवाई और उन शर्तों के बारे में जानकारी होती है जिनमें वे कार्रवाइयां शुरू होती हैं.

इस्तेमाल के सामान्य उदाहरण

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

किसी एक यूआरएल पर रोक लगाना

मेनिफ़ेस्ट V2 में आम तौर पर इस्तेमाल का एक उदाहरण, बैकग्राउंड स्क्रिप्ट में onBeforeRequest इवेंट का इस्तेमाल करके वेब अनुरोधों को ब्लॉक करना है.

Manifest V2 बैकग्राउंड स्क्रिप्ट
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

मेनिफ़ेस्ट V3 के लिए, "block" कार्रवाई टाइप का इस्तेमाल करके, एक नया declarativeNetRequest नियम बनाएं. उदाहरण के नियम में, "condition" ऑब्जेक्ट पर ध्यान दें. इसका "urlFilter", webRequest लिसनर को दिए गए urls विकल्प की जगह लेगा. "resourceTypes" कलेक्शन, उन संसाधनों की कैटगरी के बारे में बताता है जिन्हें ब्लॉक करना है. इस उदाहरण से सिर्फ़ मुख्य एचटीएमएल पेज ब्लॉक किया जा सकता है. उदाहरण के लिए, सिर्फ़ फ़ॉन्ट को ब्लॉक किया जा सकता है.

मेनिफ़ेस्ट V3 नियम की फ़ाइल
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

यह काम करे, इसके लिए आपको एक्सटेंशन की अनुमतियां अपडेट करनी होंगी. manifest.json में, "webRequestBlocking" अनुमति को "declarativeNetRequest" अनुमति से बदलें. ध्यान दें कि यूआरएल को "permissions" फ़ील्ड से हटा दिया गया है, क्योंकि कॉन्टेंट को ब्लॉक करने के लिए होस्ट की अनुमतियों की ज़रूरत नहीं होती. जैसा कि ऊपर दिखाया गया है, नियम फ़ाइल उन होस्ट या होस्ट के बारे में बताती है जिन पर डिक्लेरेटिव नेट अनुरोध लागू होता है.

अगर आपको इसे आज़माना है, तो नीचे दिया गया कोड हमारे सैंपल डेटा स्टोर में उपलब्ध है.

मेनिफ़ेस्ट V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
मेनिफ़ेस्ट V3
  "permissions": [
    "declarativeNetRequest",
  ]

एक से ज़्यादा यूआरएल रीडायरेक्ट करना

मेनिफ़ेस्ट V2 में आम तौर पर इस्तेमाल का एक और उदाहरण, वेब अनुरोधों को रीडायरेक्ट करने के लिए BeforeRequest इवेंट का इस्तेमाल करना था.

Manifest V2 बैकग्राउंड स्क्रिप्ट
chrome.webRequest.onBeforeRequest.addListener((e) => {
    console.log(e);
    return { redirectUrl: "https://developer.chrome.com/docs/extensions/mv3/intro/" };
  }, { 
    urls: [
      "https://developer.chrome.com/docs/extensions/mv2/"
    ]
  }, 
  ["blocking"]
);

मेनिफ़ेस्ट V3 के लिए, "redirect" ऐक्शन टाइप का इस्तेमाल करें. पहले की तरह ही, "urlFilter", webRequest लिसनर को पास किए गए url विकल्प को बदल देता है. ध्यान दें कि इस उदाहरण में, नियम फ़ाइल के "action" ऑब्जेक्ट में "redirect" फ़ील्ड शामिल होता है. इसमें, फ़िल्टर किए जाने वाले यूआरएल के बजाय, लौटाए जाने वाले यूआरएल की जानकारी होती है.

मेनिफ़ेस्ट V3 नियम की फ़ाइल
[
  {
    "id" : 1,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": { "url": "https://developer.chrome.com/docs/extensions/mv3/intro/" }
    },
    "condition": {
      "urlFilter": "https://developer.chrome.com/docs/extensions/mv2/",
      "resourceTypes": ["main_frame"]
    }
  }

इस स्थिति में, एक्सटेंशन की अनुमतियों में बदलाव भी करने होंगे. पहले की तरह, "webRequestBlocking" अनुमति को "declarativeNetRequest" अनुमति से बदलें. यूआरएल फिर से manifest.json से नियम फ़ाइल में ले जाए जाते हैं. ध्यान दें कि रीडायरेक्ट करने के लिए, होस्ट की अनुमति के साथ-साथ "declarativeNetRequestWithHostAccess" की अनुमति भी ज़रूरी होती है.

अगर आपको इसे आज़माना है, तो नीचे दिया गया कोड हमारे सैंपल डेटा स्टोर में उपलब्ध है.

मेनिफ़ेस्ट V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
मेनिफ़ेस्ट V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

कुकी ब्लॉक करें

मेनिफ़ेस्ट V2 में, कुकी ब्लॉक करने के लिए वेब अनुरोध के हेडर को भेजने से पहले उन्हें रोकना ज़रूरी होता है. साथ ही, किसी खास हेडर को हटाना भी ज़रूरी होता है.

Manifest V2 बैकग्राउंड स्क्रिप्ट
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

मेनिफ़ेस्ट V3 नियम फ़ाइल में मौजूद नियम के साथ भी ऐसा करता है. इस बार कार्रवाई "modifyHeaders" है. यह फ़ाइल, "requestHeaders" ऑब्जेक्ट का कलेक्शन दिखाती है. इसमें हेडर में बदलाव करने और उन्हें बदलने का तरीका बताया गया है. ध्यान दें कि "condition" ऑब्जेक्ट में सिर्फ़ "resourceTypes" कलेक्शन होता है. यह पिछले उदाहरणों में इस्तेमाल की गई वैल्यू के जैसी ही काम करता है.

अगर आपको इसे आज़माना है, तो नीचे दिया गया कोड हमारे सैंपल डेटा स्टोर में उपलब्ध है.

Manifest V3 Manifest.json
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

इस स्थिति में, एक्सटेंशन की अनुमतियों में बदलाव भी करने होंगे. पहले की तरह, "webRequestBlocking" अनुमति को "declarativeNetRequest" अनुमति से बदलें.

मेनिफ़ेस्ट V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
मेनिफ़ेस्ट V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]