chrome.debugger

कंपनी का ब्यौरा

chrome.debugger API, Chrome के रिमोट डीबगिंग प्रोटोकॉल के लिए एक वैकल्पिक ट्रांसपोर्ट के रूप में काम करता है. इंस्ट्रुमेंट नेटवर्क इंटरैक्शन के लिए एक या उससे ज़्यादा टैब अटैच करने, JavaScript को डीबग करने, डीओएम और सीएसएस में बदलाव करने वगैरह के लिए chrome.debugger का इस्तेमाल करें. sendCommand के साथ टैब और रूट इवेंट को onEvent कॉलबैक से tabId के ज़रिए टारगेट करने के लिए, Debuggee tabId का इस्तेमाल करें.

अनुमतियां

debugger

इस एपीआई का इस्तेमाल करने के लिए, आपको अपने एक्सटेंशन के मेनिफ़ेस्ट में "debugger" की अनुमति के बारे में एलान करना होगा.

{
  "name": "My extension",
  ...
  "permissions": [
    "debugger",
  ],
  ...
}

सिद्धांत और इस्तेमाल

अटैच होने के बाद, chrome.debugger API की मदद से, दिए गए टारगेट के लिए Chrome DevTools प्रोटोकॉल (सीडीपी) के निर्देश भेजे जा सकते हैं. इस दस्तावेज़ में सीडीपी के बारे में पूरी जानकारी नहीं दी गई है. सीडीपी के बारे में ज़्यादा जानने के लिए, सीडीपी का आधिकारिक दस्तावेज़ पढ़ें.

टारगेट

टारगेट किसी ऐसी चीज़ को दिखाते हैं जिसे डीबग किया जा रहा है—इसमें कोई टैब, iframe या कोई वर्कर शामिल हो सकता है. हर टारगेट की पहचान यूयूआईडी से की जाती है और उससे जुड़ा एक टाइप होता है, जैसे कि iframe, shared_worker वगैरह.

टारगेट में, लागू करने के कई कॉन्टेक्स्ट हो सकते हैं. उदाहरण के लिए, एक जैसे प्रोसेस वाले iframe को यूनीक टारगेट नहीं मिलता. इसके बजाय, उन्हें अलग-अलग कॉन्टेक्स्ट के तौर पर दिखाया जाता है, जिन्हें एक ही टारगेट से ऐक्सेस किया जा सकता है.

प्रतिबंधित डोमेन

सुरक्षा की वजहों से, chrome.debugger API सभी Chrome DevTools प्रोटोकॉल डोमेन का ऐक्सेस नहीं देता है. ये डोमेन उपलब्ध हैं: Accessibility, Access4,, अन्य होस्ट, CacheStorageDOMDebuggerDOMSnapshotWebAudioWebAuthn

फ़्रेम के साथ काम करें

टारगेट करने के लिए, फ़्रेम की वन-टू-वन मैपिंग नहीं है. किसी एक टैब में, एक ही प्रोसेस के कई फ़्रेम एक ही टारगेट शेयर कर सकते हैं. हालांकि, वे अलग-अलग एक्ज़ीक्यूशन कॉन्टेक्स्ट का इस्तेमाल कर सकते हैं. दूसरी ओर, 'प्रोसेस से बाहर हैं' iframe के लिए एक नया टारगेट बनाया जा सकता है.

सभी फ़्रेम के साथ अटैच करने के लिए, आपको हर तरह के फ़्रेम को अलग-अलग मैनेज करना होगा:

  • एक ही प्रोसेस फ़्रेम से जुड़े नए एक्ज़ीक्यूटेबल के कॉन्टेक्स्ट की पहचान करने के लिए, Runtime.executionContextCreated इवेंट सुनें.

  • जो फ़्रेम पहले से तय नहीं हुए हैं उनकी पहचान करने के लिए, मिलते-जुलते टारगेट से अटैच करने के लिए यह तरीका अपनाएं.

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

Chrome 125 और उसके बाद के वर्शन में, chrome.debugger एपीआई फ़्लैट सेशन के साथ काम करता है. इससे मुख्य डीबगर सेशन में, बच्चों के तौर पर अन्य टारगेट जोड़े जा सकते हैं. साथ ही, chrome.debugger.attach पर दोबारा कॉल किए बिना उन्हें मैसेज भेजा जा सकता है. इसके बजाय, chrome.debugger.sendCommand को कॉल करते समय sessionId प्रॉपर्टी जोड़ी जा सकती है. इससे उस चाइल्ड टारगेट की पहचान की जा सकती है जिसके लिए आपको निर्देश देना है.

प्रोसेस से बाहर के चाइल्ड फ़्रेम से अपने-आप अटैच होने के लिए, सबसे पहले Target.attachedToTarget इवेंट के लिए लिसनर जोड़ें:

chrome.debugger.onEvent.addListener((source, method, params) => {
  if (method === "Target.attachedToTarget") {
    // `source` identifies the parent session, but we need to construct a new
    // identifier for the child session
    const session = { ...source, sessionId: params.sessionId };

    // Call any needed CDP commands for the child session
    await chrome.debugger.sendCommand(session, "Runtime.enable");
  }
});

इसके बाद, true पर सेट किए गए flatten विकल्प के साथ Target.setAutoAttach कमांड भेजकर अपने-आप अटैच करें सुविधा चालू करें:

await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
  autoAttach: true,
  waitForDebuggerOnStart: false,
  flatten: true,
  filter: [{ type: "iframe", exclude: false }]
});

उदाहरण

इस एपीआई को इस्तेमाल करने के लिए, chrome-extension-sample डेटा स्टोर करने की जगह से डीबगर एपीआई का उदाहरण इंस्टॉल करें.

टाइप

Debuggee

Debuggee आइडेंटिफ़ायर. tabId, एक्सटेंशनId या targetId दर्ज करना ज़रूरी है

प्रॉपर्टी

  • extensionId

    स्ट्रिंग ज़रूरी नहीं

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

  • tabId

    नंबर ज़रूरी नहीं

    उस टैब का आईडी जिसे डीबग करना है.

  • targetId

    स्ट्रिंग ज़रूरी नहीं

    डीबग टारगेट का ओपेक आईडी.

DebuggerSession

Chrome 125 और इसके बाद के वर्शन

डीबगर सेशन आइडेंटिफ़ायर. TabId, extensionsId या targetId में से कोई एक बताना ज़रूरी है. इसके अलावा, एक वैकल्पिक sessionId दिया जा सकता है. अगर onEvent से भेजे गए आर्ग्युमेंट के लिए, sessionId दिया गया है, तो इसका मतलब है कि इवेंट, रूट डीबगी सेशन में चाइल्ड प्रोटोकॉल सेशन से आ रहा है. अगर sendCommand को पास करने पर sessionId दिया जाता है, तो यह रूट डीबगी सेशन में चाइल्ड प्रोटोकॉल सेशन को टारगेट करता है.

प्रॉपर्टी

  • extensionId

    स्ट्रिंग ज़रूरी नहीं

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

  • sessionId

    स्ट्रिंग ज़रूरी नहीं

    Chrome DevTools प्रोटोकॉल सेशन की ओपेक आईडी. यह TabId, एक्सटेंशनId या targetId से पहचाने गए रूट सेशन में चाइल्ड सेशन की पहचान करता है.

  • tabId

    नंबर ज़रूरी नहीं

    उस टैब का आईडी जिसे डीबग करना है.

  • targetId

    स्ट्रिंग ज़रूरी नहीं

    डीबग टारगेट का ओपेक आईडी.

DetachReason

Chrome 44 और इसके बाद के वर्शन

कनेक्शन बंद करने की वजह.

Enum

"target_closed"

"canceled_by_user"

TargetInfo

डीबग टारगेट की जानकारी

प्रॉपर्टी

  • अटैच किया गया

    boolean

    अगर डीबगर पहले से अटैच है, तो सही.

  • extensionId

    स्ट्रिंग ज़रूरी नहीं

    एक्सटेंशन आईडी, अगर टाइप = 'background_page' है, तो इससे पता चलता है.

  • faviconUrl

    स्ट्रिंग ज़रूरी नहीं

    फ़ेविकॉन का यूआरएल टारगेट करें.

  • id

    स्ट्रिंग

    लक्ष्य आईडी.

  • tabId

    नंबर ज़रूरी नहीं

    टैब आईडी, अगर टाइप == 'page' है, तो इसे परिभाषित किया जाता है.

  • title

    स्ट्रिंग

    टारगेट पेज का टाइटल.

  • टाइप

    टारगेट टाइप.

  • यूआरएल

    स्ट्रिंग

    टारगेट यूआरएल.

TargetInfoType

Chrome 44 और इसके बाद के वर्शन

टारगेट टाइप.

Enum

"background_page"

तरीके

attach()

वादा
chrome.debugger.attach(
  target: Debuggee,
  requiredVersion: string,
  callback?: function,
)

दिए गए टारगेट में डीबगर को अटैच करता है.

पैरामीटर

  • टारगेट

    वह टारगेट डीबग किया जा रहा है जिसमें आपको अटैच करना है.

  • requiredVersion

    स्ट्रिंग

    डीबग करने के प्रोटोकॉल का ज़रूरी वर्शन ("0.1"). सिर्फ़ मिलते-जुलते मेजर वर्शन और बड़े या बराबर माइनर वर्शन वाले डीबगी को अटैच किया जा सकता है. प्रोटोकॉल वर्शन की सूची यहां देखी जा सकती है.

  • कॉलबैक

    फ़ंक्शन ज़रूरी नहीं

    callback पैरामीटर ऐसा दिखता है:

    ()=>void

लौटाए गए प्रॉडक्ट

  • Promise<void>

    Chrome 96 के बाद के वर्शन

    प्रॉमिस, मेनिफ़ेस्ट V3 और इसके बाद के वर्शन में काम करता है. हालांकि, पुराने सिस्टम के साथ काम करने के लिए कॉलबैक दिए जाते हैं. आप एक ही फ़ंक्शन कॉल पर दोनों का इस्तेमाल नहीं कर सकते. प्रॉमिस उसी टाइप के साथ रिज़ॉल्व हो जाती है जिसे कॉलबैक को पास किया जाता है.

detach()

वादा
chrome.debugger.detach(
  target: Debuggee,
  callback?: function,
)

डीबगर को दिए गए टारगेट से अलग करता है.

पैरामीटर

  • टारगेट

    वह टारगेट डीबग किया जा रहा है जिससे आपको अलग करना है.

  • कॉलबैक

    फ़ंक्शन ज़रूरी नहीं

    callback पैरामीटर ऐसा दिखता है:

    ()=>void

लौटाए गए प्रॉडक्ट

  • Promise<void>

    Chrome 96 के बाद के वर्शन

    प्रॉमिस, मेनिफ़ेस्ट V3 और इसके बाद के वर्शन में काम करता है. हालांकि, पुराने सिस्टम के साथ काम करने के लिए कॉलबैक दिए जाते हैं. आप एक ही फ़ंक्शन कॉल पर दोनों का इस्तेमाल नहीं कर सकते. प्रॉमिस उसी टाइप के साथ रिज़ॉल्व हो जाती है जिसे कॉलबैक को पास किया जाता है.

getTargets()

वादा
chrome.debugger.getTargets(
  callback?: function,
)

उपलब्ध डीबग टारगेट की सूची दिखाता है.

पैरामीटर

  • कॉलबैक

    फ़ंक्शन ज़रूरी नहीं

    callback पैरामीटर ऐसा दिखता है:

    (result: TargetInfo[])=>void

    • नतीजा

      उपलब्ध डीबग टारगेट से जुड़े TargetInfo ऑब्जेक्ट की कलेक्शन.

लौटाए गए प्रॉडक्ट

  • Promise<TargetInfo[]>

    Chrome 96 के बाद के वर्शन

    प्रॉमिस, मेनिफ़ेस्ट V3 और इसके बाद के वर्शन में काम करता है. हालांकि, पुराने सिस्टम के साथ काम करने के लिए कॉलबैक दिए जाते हैं. आप एक ही फ़ंक्शन कॉल पर दोनों का इस्तेमाल नहीं कर सकते. प्रॉमिस उसी टाइप के साथ रिज़ॉल्व हो जाती है जिसे कॉलबैक को पास किया जाता है.

sendCommand()

वादा
chrome.debugger.sendCommand(
  target: DebuggerSession,
  method: string,
  commandParams?: object,
  callback?: function,
)

डीबगिंग टारगेट को दिया गया निर्देश भेजता है.

पैरामीटर

  • टारगेट

    वह टारगेट डीबग किया जा रहा है जिस पर आपको निर्देश भेजना है.

  • method

    स्ट्रिंग

    तरीके का नाम. यह रिमोट डीबगिंग प्रोटोकॉल के बताए गए तरीकों में से एक होना चाहिए.

  • commandParams

    ऑब्जेक्ट ज़रूरी नहीं

    अनुरोध पैरामीटर के साथ JSON ऑब्जेक्ट. यह ऑब्जेक्ट, दिए गए तरीके के लिए रिमोट डीबगिंग पैरामीटर स्कीम के मुताबिक होना चाहिए.

  • कॉलबैक

    फ़ंक्शन ज़रूरी नहीं

    callback पैरामीटर ऐसा दिखता है:

    (result?: object)=>void

    • नतीजा

      ऑब्जेक्ट ज़रूरी नहीं

      रिस्पॉन्स के साथ JSON ऑब्जेक्ट. रिस्पॉन्स का स्ट्रक्चर, तरीके के नाम के हिसाब से अलग-अलग होता है. इसे रिमोट डीबगिंग प्रोटोकॉल में मौजूद कमांड की जानकारी के 'returns' एट्रिब्यूट से तय किया जाता है.

लौटाए गए प्रॉडक्ट

  • Promise<object|undefined>

    Chrome 96 के बाद के वर्शन

    प्रॉमिस, मेनिफ़ेस्ट V3 और इसके बाद के वर्शन में काम करता है. हालांकि, पुराने सिस्टम के साथ काम करने के लिए कॉलबैक दिए जाते हैं. आप एक ही फ़ंक्शन कॉल पर दोनों का इस्तेमाल नहीं कर सकते. प्रॉमिस उसी टाइप के साथ रिज़ॉल्व हो जाती है जिसे कॉलबैक को पास किया जाता है.

इवेंट

onDetach

chrome.debugger.onDetach.addListener(
  callback: function,
)

तब सक्रिय होता है, जब ब्राउज़र, टैब के लिए डीबगिंग सेशन को खत्म करता है. ऐसा तब होता है, जब टैब को बंद किया जा रहा हो या अटैच किए गए टैब के लिए Chrome DevTools को शुरू किया गया हो.

पैरामीटर

onEvent

chrome.debugger.onEvent.addListener(
  callback: function,
)

टारगेट से जुड़ी समस्याओं के इंस्ट्रुमेंटेशन इवेंट को डीबग करने पर ट्रिगर होता है.

पैरामीटर

  • कॉलबैक

    फ़ंक्शन

    callback पैरामीटर ऐसा दिखता है:

    (source: DebuggerSession,method: string,params?: object)=>void

    • method

      स्ट्रिंग

    • params

      ऑब्जेक्ट ज़रूरी नहीं