browser.debugger

বিবরণ

chrome.debugger API, Chrome-এর রিমোট ডিবাগিং প্রোটোকলের বিকল্প ট্রান্সপোর্ট হিসেবে কাজ করে। নেটওয়ার্ক ইন্টার‍্যাকশন ইনস্ট্রুমেন্ট করতে, JavaScript ডিবাগ করতে, DOM ও CSS পরিবর্তন করতে এবং আরও অনেক কিছু করতে এক বা একাধিক ট্যাবে অ্যাটাচ করতে chrome.debugger ব্যবহার করুন। sendCommand সহ ট্যাব টার্গেট করতে এবং onEvent কলব্যাক থেকে tabId অনুযায়ী ইভেন্ট রাউট করতে Debuggee প্রপার্টি tabId ব্যবহার করুন।

অনুমতি

debugger

এই API ব্যবহার করতে হলে, আপনার এক্সটেনশনের ম্যানিফেস্টে "debugger" অনুমতি ঘোষণা করতে হবে।

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

এন্টারপ্রাইজ নীতি সংক্রান্ত বিধিনিষেধ

এন্টারপ্রাইজ ডিভাইসে, কিছু নীতি অ্যাটাচ করার সময় অল-অর-নাথিং মডেল ব্যবহার করে এক্সটেনশনকে ডিবাগার অ্যাটাচ করা থেকে সীমাবদ্ধ করতে পারে (browser.debugger.attach()):

  • হোস্ট সংক্রান্ত বিধিনিষেধ: এন্টারপ্রাইজ নীতি যদি কোনও এক্সটেনশনের জন্য ExtensionSettings ব্লক করা হোস্ট (runtime_blocked_hosts) কনফিগার করে, তাহলে browser.debugger.attach() সব টার্গেটে ব্লক করা হয় এবং এই সমস্যাটি হয়: "Host access is restricted by policy." (এমনকি স্বতন্ত্র অরিজিন runtime_allowed_hosts-এ থাকলেও)।
  • স্ক্রিনশট ও DLP নীতি: এন্টারপ্রাইজ নীতি DisableScreenshots স্ক্রিনশট ক্যাপচার করা বন্ধ করে দিলে অথবা টার্গেটে ডেটা হারানো প্রতিরোধ (DLP) সংক্রান্ত নিয়ম প্রযোজ্য হলে, browser.debugger.attach() এই সমস্যার মেসেজ সহ ব্যর্থ হয়: "Screenshot capture is restricted by policy."।

ধারণা ও ব্যবহার

অ্যাটাচ করা হয়ে গেলে, browser.debugger API আপনাকে কোনও নির্দিষ্ট টার্গেটে Chrome DevTools Protocol (CDP) কমান্ড পাঠাতে দেয়। এই ডকুমেন্টেশনে CDP-র বিশদ বিবরণ দেওয়া হয়নি —CDP সম্পর্কে আরও জানতে CDP-র অফিসিয়াল ডকুমেন্টেশন দেখুন।

টার্গেট

টার্গেট হল এমন কিছু যা ডিবাগ করা হচ্ছে—এর মধ্যে ট্যাব, iframe বা ওয়ার্কার অন্তর্ভুক্ত থাকতে পারে। UUID-এর মাধ্যমে প্রতিটি টার্গেট শনাক্ত করা হয় এবং এর সাথে যুক্ত টাইপ (যেমন iframe, shared_worker ও আরও অনেক কিছু) থাকে।

কোনও টার্গেটের মধ্যে একাধিক এক্সিকিউশন কনটেক্সট থাকতে পারে—যেমন, একই প্রসেস আইফ্রেম কোনও অনন্য টার্গেট পায় না, পরিবর্তে সেগুলিকে আলাদা আলাদা কনটেক্সট হিসেবে দেখানো হয় যেগুলি একটি টার্গেট থেকে অ্যাক্সেস করা যায়।

বিধিনিষেধযুক্ত ডোমেন

নিরাপত্তার কারণে, browser.debugger API সব Chrome DevTools প্রোটোকল ডোমেনে অ্যাক্সেস প্রদান করে না। উপলভ্য ডোমেনগুলি হল: অ্যাক্সেসিবিলিটি, অডিট, CacheStorage, Console, CSS, Database, Debugger, DOM, DOMDebugger, DOMSnapshot, Emulation, Fetch, IO, Input, Inspector, Log, Network, Overlay, Page, Performance, Runtime, Storage, Target, Tracing, WebAudio এবং WebAuthn.

ফ্রেমের সাথে কাজ করা

ফ্রেমের সাথে টার্গেটের ওয়ান-টু-ওয়ান ম্যাপিং নেই। একটি ট্যাবের মধ্যে, একই প্রসেস ফ্রেমের একাধিক ইনস্ট্যান্স একই টার্গেট শেয়ার করতে পারে, কিন্তু আলাদা এক্সিকিউশন কনটেক্সট ব্যবহার করে। অন্যদিকে, প্রসেসের বাইরে থাকা iframe-এর জন্য নতুন টার্গেট তৈরি করা হতে পারে।

সব ফ্রেমে অ্যাটাচ করতে, আপনাকে প্রতিটি ধরনের ফ্রেম আলাদাভাবে ম্যানেজ করতে হবে:

  • একই প্রসেস ফ্রেমের সাথে যুক্ত নতুন এক্সিকিউশন কনটেক্সট শনাক্ত করতে Runtime.executionContextCreated ইভেন্ট শুনুন।

  • প্রসেস করা হয়নি এমন ফ্রেম শনাক্ত করতে, সম্পর্কিত টার্গেটে অ্যাটাচ করার ধাপগুলি অনুসরণ করুন।

কোনও টার্গেটের সাথে কানেক্ট করার পরে, আপনি হয়ত আরও সম্পর্কিত টার্গেটের সাথে কানেক্ট করতে চাইবেন যার মধ্যে প্রসেস করা হয়নি এমন চাইল্ড ফ্রেম বা সংশ্লিষ্ট ওয়ার্কার অন্তর্ভুক্ত।

Chrome 125 থেকে শুরু করে, browser.debugger API ফ্ল্যাট সেশন সমর্থন করে। এটি আপনাকে মূল ডিবাগার সেশনের চাইল্ড হিসেবে অতিরিক্ত টার্গেট যোগ করতে এবং browser.debugger.attach-এ আরেকটি কল করার প্রয়োজন ছাড়াই তাদের মেসেজ করতে দেয়। পরিবর্তে, আপনি sessionId কল করার সময় browser.debugger.sendCommand এমন একটি প্রপার্টি যোগ করতে পারেন যার মাধ্যমে আপনি সেই চাইল্ড টার্গেটকে শনাক্ত করতে পারবেন যাকে আপনি কমান্ড পাঠাতে চান।

প্রসেস না করা চাইল্ড ফ্রেমে অটোমেটিক অ্যাটাচ করতে, প্রথমে Target.attachedToTarget ইভেন্টের জন্য একটি লিসনার যোগ করুন:

browser.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 browser.debugger.sendCommand(session, "Runtime.enable");
  }
});

তারপরে, Target.setAutoAttach কমান্ড পাঠিয়ে অটোমেটিক অ্যাটাচ চালু করুন, যেখানে flatten বিকল্পটি true হিসেবে সেট করা আছে:

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

অটো-অ্যাটাচ শুধুমাত্র সেইসব ফ্রেমে অ্যাটাচ করে যেগুলি টার্গেট জানে, এটি সেইসব ফ্রেমের মধ্যে সীমাবদ্ধ যেগুলি এর সাথে যুক্ত ফ্রেমের অবিলম্বে চাইল্ড। যেমন, ফ্রেমের হায়ারার্কি A -> B -> C (যেখানে সবগুলি ক্রস-অরিজিন) হলে, A-এর সাথে যুক্ত টার্গেটের জন্য Target.setAutoAttach কল করলে, সেশনটি B-এর সাথেও অ্যাটাচ হয়ে যাবে। তবে, এটি রিকার্সিভ নয়, তাই Target.setAutoAttach-কে C-এর সাথে সেশন অ্যাটাচ করার জন্য B-এর ক্ষেত্রেও কল করতে হবে।

উদাহরণ

এই API ব্যবহার করে দেখতে, chrome-extension-samples রেপোজিটরি থেকে debugger API উদাহরণ ইনস্টল করুন।

ধরন

Debuggee

ডিবাগ করা হচ্ছে এমন প্রসেসের শনাক্তকারী। tabId, extensionId বা targetId-এর মধ্যে কোনও একটি অবশ্যই উল্লেখ করতে হবে

প্রপার্টি

  • extensionId

    স্ট্রিং ঐচ্ছিক

    আপনি যে এক্সটেনশন ডিবাগ করতে চান তার আইডি। --silent-debugger-extension-api কমান্ড-লাইন সুইচ ব্যবহার করা হলেই শুধুমাত্র এক্সটেনশনের ব্যাকগ্রাউন্ড পৃষ্ঠায় অ্যাটাচ করা যায়।

  • tabId

    নম্বর ঐচ্ছিক

    আপনি যে ট্যাবটি ডিবাগ করতে চান তার আইডি।

  • targetId

    স্ট্রিং ঐচ্ছিক

    ডিবাগ টার্গেটের অস্বচ্ছ আইডি।

DebuggerSession

Chrome 125+

ডিবাগার সেশন শনাক্তকারী। tabId, extensionId বা targetId-এর মধ্যে একটি অবশ্যই উল্লেখ করতে হবে। এছাড়াও, ঐচ্ছিক sessionId প্রদান করা যেতে পারে। onEvent থেকে পাঠানো আর্গুমেন্টের জন্য sessionId নির্দিষ্ট করা থাকলে, এর অর্থ হল ইভেন্টটি রুট ডিবাগি সেশনের মধ্যে চাইল্ড প্রোটোকল সেশন থেকে আসছে। sendCommand-এ sessionId নির্দিষ্ট করা থাকলে, এটি রুট ডিবাগি সেশনের মধ্যে চাইল্ড প্রোটোকল সেশনকে টার্গেট করে।

প্রপার্টি

  • extensionId

    স্ট্রিং ঐচ্ছিক

    আপনি যে এক্সটেনশন ডিবাগ করতে চান তার আইডি। --silent-debugger-extension-api কমান্ড-লাইন সুইচ ব্যবহার করা হলেই শুধুমাত্র এক্সটেনশনের ব্যাকগ্রাউন্ড পৃষ্ঠায় অ্যাটাচ করা যায়।

  • sessionId

    স্ট্রিং ঐচ্ছিক

    Chrome DevTools Protocol সেশনের অস্বচ্ছ আইডি। tabId, extensionId বা targetId দ্বারা শনাক্ত করা রুট সেশনের মধ্যে একটি চাইল্ড সেশন শনাক্ত করে।

  • tabId

    নম্বর ঐচ্ছিক

    আপনি যে ট্যাবটি ডিবাগ করতে চান তার আইডি।

  • targetId

    স্ট্রিং ঐচ্ছিক

    ডিবাগ টার্গেটের অস্বচ্ছ আইডি।

DetachReason

Chrome 44+

কানেকশন বন্ধ করার কারণ।

Enum

"target_closed"

"canceled_by_user"

TargetInfo

ডিবাগ টার্গেট সংক্রান্ত তথ্য

প্রপার্টি

  • অ্যাটাচ করা আছে

    বুলিয়ান

    ডিবাগার আগে থেকেই অ্যাটাচ করা থাকলে, 'সত্য'।

  • extensionId

    স্ট্রিং ঐচ্ছিক

    টাইপ = 'background_page' হলে এক্সটেনশন আইডি নির্দিষ্ট করা হয়।

  • faviconUrl

    স্ট্রিং ঐচ্ছিক

    টার্গেট ফেভিকন URL.

  • id

    স্ট্রিং

    টার্গেট আইডি।

  • tabId

    নম্বর ঐচ্ছিক

    টাইপ == 'page' হলে, ট্যাব আইডি নির্দিষ্ট করা হয়।

  • শীর্ষক

    স্ট্রিং

    টার্গেট পৃষ্ঠার শীর্ষক।

  • ধরন

    টার্গেটের ধরন।

  • URL

    স্ট্রিং

    টার্গেট URL.

TargetInfoType

Chrome 44+

টার্গেটের ধরন।

Enum

"page"

"background_page"

"কর্মী"

"অন্যান্য"

পদ্ধতি

attach()

chrome.debugger.attach(
  target: Debuggee,
  requiredVersion: string,
)
: Promise<void>

প্রদত্ত টার্গেটে ডিবাগার অ্যাটাচ করে।

প্যারামিটারগুলি

  • target

    আপনি যে টার্গেটে অ্যাটাচ করতে চান সেটি ডিবাগ করা।

  • requiredVersion

    স্ট্রিং

    প্রয়োজনীয় ডিবাগিং প্রোটোকল ভার্সন ("0.1")। শুধুমাত্র মেজর ভার্সন ম্যাচ করলে এবং মাইনর ভার্সন সমান বা বেশি হলে তবেই কোনও ব্যক্তি ডিবাগির সাথে অ্যাটাচ করতে পারবেন। প্রোটোকল ভার্সনের তালিকা এখানে পাওয়া যাবে।

রিটার্ন

  • Promise<void>

    Chrome 96+

    অ্যাটাচ করার অপারেশন সফল বা ব্যর্থ হলে সমাধান হয়ে যায়। প্রমিসটি কোনও ভ্যালু ছাড়াই সমাধান হয়ে যায়। অ্যাটাচ করা না গেলে, প্রতিশ্রুতি বাতিল করা হবে।

detach()

chrome.debugger.detach(
  target: Debuggee,
)
: Promise<void>

প্রদত্ত টার্গেট থেকে ডিবাগারকে আলাদা করে।

প্যারামিটারগুলি

  • target

    আপনি যে টার্গেট থেকে ডিটাচ করতে চান সেটি।

রিটার্ন

  • Promise<void>

    Chrome 96+

    আলাদা করার অপারেশন সফল বা ব্যর্থ হলে সমাধান হয়ে যায়। প্রমিসটি কোনও ভ্যালু ছাড়াই সমাধান হয়ে যায়। আলাদা করা না গেলে, প্রতিশ্রুতি বাতিল করা হবে।

getTargets()

chrome.debugger.getTargets(): Promise<TargetInfo[]>

উপলভ্য ডিবাগ টার্গেটের তালিকা রিটার্ন করে।

রিটার্ন

sendCommand()

chrome.debugger.sendCommand(
  target: DebuggerSession,
  method: string,
  commandParams?: object,
)
: Promise<object | undefined>

ডিবাগিং টার্গেটে প্রদত্ত কমান্ড পাঠায়।

প্যারামিটারগুলি

  • আপনি যে টার্গেটে কমান্ড পাঠাতে চান সেটি ডিবাগ করা।

  • পদ্ধতি

    স্ট্রিং

    মেথডের নাম। রিমোট ডিবাগিং প্রোটোকল দ্বারা সংজ্ঞায়িত পদ্ধতির মধ্যে একটি হতে হবে।

  • commandParams

    অবজেক্ট ঐচ্ছিক

    অনুরোধ প্যারামিটার সহ JSON অবজেক্ট। এই অবজেক্টকে প্রদত্ত পদ্ধতির জন্য রিমোট ডিবাগিং প্যারামিটার স্কিম মেনে চলতে হবে।

রিটার্ন

  • Promise<object | undefined>

    Chrome 96+

    রেসপন্স বডি। মেসেজ পোস্ট করার সময় কোনও সমস্যা হলে, প্রতিশ্রুতি বাতিল করা হবে।

ইভেন্ট

onDetach

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

ট্যাবের জন্য ব্রাউজার ডিবাগিং সেশন বন্ধ করে দিলে ফায়ার করা হয়। ট্যাব বন্ধ করা হলে অথবা অ্যাটাচ করা ট্যাবের জন্য Chrome DevTools চালু করা হলে এটি হয়।

প্যারামিটারগুলি

  • কলব্যাক

    ফাংশন

    callback প্যারামিটারটি দেখতে এমন:

    (source: Debuggee, reason: DetachReason) => void

onEvent

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

ডিবাগ করার টার্গেট সংক্রান্ত সমস্যার ইনস্ট্রুমেন্টেশন ইভেন্ট ফায়ার করা হলে।

প্যারামিটারগুলি

  • কলব্যাক

    ফাংশন

    callback প্যারামিটারটি দেখতে এমন:

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

    • সোর্স
    • পদ্ধতি

      স্ট্রিং

    • params

      অবজেক্ট ঐচ্ছিক