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

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

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

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

मेनिफ़ेस्ट 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 इवेंट का इस्तेमाल करके, वेब अनुरोधों को ब्लॉक करना एक सामान्य इस्तेमाल का उदाहरण था.

मेनिफ़ेस्ट 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 इवेंट का इस्तेमाल करना एक आम उदाहरण था.

मेनिफ़ेस्ट 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 में, कुकी को ब्लॉक करने के लिए, वेब अनुरोध हेडर को भेजे जाने से पहले उन्हें इंटरसेप्ट करना और किसी खास हेडर को हटाना ज़रूरी है.

मेनिफ़ेस्ट 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" कलेक्शन होता है. यह पिछले उदाहरणों की तरह ही वैल्यू के साथ काम करता है.

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

मेनिफ़ेस्ट 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": [
    ""
  ]