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

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

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

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

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

परिचय

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

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

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

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

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

नेटवर्क अनुरोध को मैनेज करने के लिए, निर्देश के बजाय सुझाव देने की अनुमति से जुड़े नियम बनाना

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

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

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

किसी एक यूआरएल को ब्लॉक करना

मेनिफ़ेस्ट V2 में, बैकग्राउंड स्क्रिप्ट में onBeforeRequest इवेंट का इस्तेमाल करके वेब अनुरोधों को ब्लॉक किया जाता था.

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

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

Manifest 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",
  ]

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

Manifest V2 में, वेब अनुरोधों को रीडायरेक्ट करने के लिए BeforeRequest इवेंट का इस्तेमाल किया जाता था.

Manifest V2 की बैकग्राउंड स्क्रिप्ट
browser.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"]
);

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

Manifest 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 की बैकग्राउंड स्क्रिप्ट
browser.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": [
    ""
  ]