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

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

Web Request API और Declarative Net Request API में काफ़ी अंतर है. एक फ़ंक्शन कॉल को दूसरे फ़ंक्शन कॉल से बदलने के बजाय, आपको इस्तेमाल के उदाहरणों के हिसाब से अपना कोड फिर से लिखना होगा. इस सेक्शन में, इस प्रोसेस के बारे में बताया गया है.

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

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

परिचय

Manifest V2 में, वेब अनुरोधों को ब्लॉक करने से एक्सटेंशन और उन पेजों की परफ़ॉर्मेंस पर काफ़ी असर पड़ सकता है जिनके साथ वे काम करते हैं. webRequest नेमस्पेस में नौ ऐसे इवेंट होते हैं जो परफ़ॉर्मेंस को धीमा कर सकते हैं. इनमें से हर इवेंट के लिए, इवेंट हैंडलर की संख्या तय नहीं होती. इससे भी ज़्यादा परेशानी यह है कि हर वेब पेज को कई एक्सटेंशन ब्लॉक कर सकते हैं. साथ ही, इसके लिए ज़रूरी अनुमतियां, निजता पर बुरा असर डालती हैं. मेनिफ़ेस्ट 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" फ़ील्ड से हटा दिया गया है, क्योंकि कॉन्टेंट को ब्लॉक करने के लिए होस्ट की अनुमतियों की ज़रूरत नहीं होती. ऊपर दिए गए उदाहरण में दिखाया गया है कि नियम वाली फ़ाइल में, उन होस्ट के बारे में जानकारी दी गई है जिन पर डेक्लेरेटिव नेट रिक्वेस्ट लागू होती है.

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

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
Manifest 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" अनुमति भी ज़रूरी है.

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

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
Manifest V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

कुकी ब्लॉक करना

Manifest 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" अनुमति से बदलें.

Manifest V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
Manifest V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]