chrome.debugger

বর্ণনা

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

অনুমতি

debugger

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

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

এন্টারপ্রাইজ নীতি সীমাবদ্ধতা

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

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

ধারণা এবং ব্যবহার

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

লক্ষ্য

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

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

সীমাবদ্ধ ডোমেন

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

ফ্রেম নিয়ে কাজ করুন

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

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

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

ক্রোম ১২৫ থেকে, chrome.debugger API ফ্ল্যাট সেশন সমর্থন করে। এর ফলে আপনি আপনার মূল ডিবাগার সেশনে অতিরিক্ত টার্গেটকে চাইল্ড হিসেবে যুক্ত করতে পারেন এবং 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");
  }
});

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

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

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

উদাহরণ

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

প্রকারভেদ

Debuggee

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

বৈশিষ্ট্য

  • এক্সটেনশন আইডি

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

    যে এক্সটেনশনটি আপনি ডিবাগ করতে চান তার আইডি। কোনো এক্সটেনশনের ব্যাকগ্রাউন্ড পেজে সংযুক্ত হওয়া কেবল তখনই সম্ভব যখন --silent-debugger-extension-api কমান্ড-লাইন সুইচটি ব্যবহার করা হয়।

  • ট্যাবআইডি

    সংখ্যা ঐচ্ছিক

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

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

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

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

DebuggerSession

ক্রোম ১২৫+

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

বৈশিষ্ট্য

  • এক্সটেনশন আইডি

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

    যে এক্সটেনশনটি আপনি ডিবাগ করতে চান তার আইডি। কোনো এক্সটেনশনের ব্যাকগ্রাউন্ড পেজে সংযুক্ত হওয়া কেবল তখনই সম্ভব যখন --silent-debugger-extension-api কমান্ড-লাইন সুইচটি ব্যবহার করা হয়।

  • সেশনআইডি

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

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

  • ট্যাবআইডি

    সংখ্যা ঐচ্ছিক

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

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

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

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

DetachReason

ক্রোম ৪৪+

সংযোগ বিচ্ছিন্ন হওয়ার কারণ।

এনাম

"টার্গেট_ক্লোজড"

"ব্যবহারকারী দ্বারা বাতিল করা হয়েছে"

TargetInfo

ডিবাগ টার্গেট তথ্য

বৈশিষ্ট্য

  • সংযুক্ত

    বুলিয়ান

    ডিবাগার আগে থেকেই সংযুক্ত থাকলে সত্য হবে।

  • এক্সটেনশন আইডি

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

    এক্সটেনশন আইডি, যা type = 'background_page' হলে সংজ্ঞায়িত হয়।

  • faviconUrl

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

    লক্ষ্য ফেভিকন ইউআরএল।

  • আইডি

    স্ট্রিং

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

  • ট্যাবআইডি

    সংখ্যা ঐচ্ছিক

    ট্যাব আইডি, যা type == 'page' হলে সংজ্ঞায়িত হয়।

  • শিরোনাম

    স্ট্রিং

    লক্ষ্য পৃষ্ঠার শিরোনাম।

  • লক্ষ্যের ধরণ।

  • ইউআরএল

    স্ট্রিং

    লক্ষ্য ইউআরএল।

TargetInfoType

ক্রোম ৪৪+

লক্ষ্যের ধরণ।

এনাম

'পৃষ্ঠা'

"পটভূমি_পৃষ্ঠা"

"শ্রমিক"

"অন্যান্য"

পদ্ধতি

attach()

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

প্রদত্ত টার্গেটে ডিবাগার সংযুক্ত করে।

প্যারামিটার

  • লক্ষ্য

    ডিবাগিং টার্গেট, যার সাথে আপনি সংযুক্ত হতে চান।

  • প্রয়োজনীয় সংস্করণ

    স্ট্রিং

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

ফেরত

  • প্রতিশ্রুতি<শূন্য>

    ক্রোম ৯৬+

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

detach()

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

প্রদত্ত টার্গেট থেকে ডিবাগার বিচ্ছিন্ন করে।

প্যারামিটার

  • লক্ষ্য

    ডিবাগিং টার্গেট, যেখান থেকে আপনি ডিটাচ করতে চান।

ফেরত

  • প্রতিশ্রুতি<শূন্য>

    ক্রোম ৯৬+

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

getTargets()

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

উপলব্ধ ডিবাগ টার্গেটগুলোর তালিকা ফেরত দেয়।

ফেরত

sendCommand()

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

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

প্যারামিটার

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

  • পদ্ধতি

    স্ট্রিং

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

  • কমান্ডপ্যারামস

    বস্তু ঐচ্ছিক

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

ফেরত

  • প্রতিশ্রুতি<object | undefined>

    ক্রোম ৯৬+

    প্রতিক্রিয়া অংশ। বার্তা পোস্ট করার সময় কোনো ত্রুটি ঘটলে, প্রমিসটি প্রত্যাখ্যাত হবে।

ইভেন্টগুলি

onDetach

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

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

প্যারামিটার

onEvent

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

যখনই ডিবাগিং টার্গেট ইন্সট্রুমেন্টেশন ইভেন্ট জারি করে, তখনই এটি সক্রিয় হয়।

প্যারামিটার

  • কলব্যাক

    ফাংশন

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

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