browser.offscreen

বিবরণ

অফস্ক্রিন ডকুমেন্ট তৈরি ও ম্যানেজ করতে offscreen API ব্যবহার করুন।

অনুমতি

offscreen

Offscreen API ব্যবহার করতে, এক্সটেনশন ম্যানিফেস্টে "offscreen" অনুমতি ঘোষণা করুন। যেমন:

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

উপলভ্যতা

Chrome 109+ MV3+

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

পরিষেবা কর্মীর DOM অ্যাক্সেস নেই এবং অনেক ওয়েবসাইটে কন্টেন্ট নিরাপত্তা নীতি আছে যা কন্টেন্ট স্ক্রিপ্টের কার্যকারিতা সীমিত করে। অফস্ক্রিন API, এক্সটেনশনকে নতুন উইন্ডো বা ট্যাব খুলে ব্যবহারকারীর অভিজ্ঞতা ব্যাহত না করেই লুকানো ডকুমেন্টে DOM API ব্যবহার করার অনুমতি দেয়। runtime API হল একমাত্র এক্সটেনশন API যা অফস্ক্রিন ডকুমেন্ট ব্যবহার করে।

অফস্ক্রিন ডকুমেন্ট হিসেবে লোড করা পৃষ্ঠাগুলি অন্যান্য ধরনের এক্সটেনশন পৃষ্ঠা থেকে আলাদাভাবে ম্যানেজ করা হয়। এক্সটেনশনের অনুমতি অফস্ক্রিন ডকুমেন্টেও প্রযোজ্য হয়, তবে এক্সটেনশন API অ্যাক্সেস করার ক্ষেত্রে সীমাবদ্ধতা থাকে। যেমন, browser.runtime API হল একমাত্র এক্সটেনশন API যা অফস্ক্রিন ডকুমেন্ট দ্বারা পরিচালিত হয়, তাই মেসেজিংকে সেই API-এর মেম্বার ব্যবহার করে ম্যানেজ করতে হবে।

অফস্ক্রিন ডকুমেন্ট কীভাবে সাধারণ পৃষ্ঠা থেকে আলাদা আচরণ করে তা নিচে উল্লেখ করা হল:

  • অফস্ক্রিন ডকুমেন্টের URL অবশ্যই এক্সটেনশনের সাথে বান্ডেল করা একটি স্ট্যাটিক HTML ফাইল হতে হবে।
  • স্ক্রিনের বাইরে থাকা ডকুমেন্টে ফোকাস করা যায় না।
  • অফস্ক্রিন ডকুমেন্ট হল window-এর একটি ইনস্ট্যান্স, কিন্তু এর opener প্রপার্টির ভ্যালু সবসময় null হয়।
  • যদিও এক্সটেনশন প্যাকেজে একাধিক অফস্ক্রিন ডকুমেন্ট থাকতে পারে, তবে ইনস্টল করা এক্সটেনশন শুধুমাত্র একবারে একটি খোলা রাখতে পারে। এক্সটেনশনটি চালু ছদ্মবেশী প্রোফাইল সহ স্প্লিট মোডে চললে, সাধারণ ও ছদ্মবেশী প্রোফাইল, দু'টিতেই একটি করে অফস্ক্রিন ডকুমেন্ট থাকতে পারে।

অফস্ক্রিন ডকুমেন্ট তৈরি ও বন্ধ করতে browser.offscreen.createDocument() ও browser.offscreen.closeDocument() ব্যবহার করুন। createDocument()-এর জন্য ডকুমেন্টের url, কারণ ও যুক্তি প্রয়োজন:

browser.offscreen.createDocument({
  url: 'off_screen.html',
  reasons: ['CLIPBOARD'],
  justification: 'reason for needing the document',
});

কারণ

বৈধ কারণের তালিকা দেখতে, কারণ বিভাগ দেখুন। ডকুমেন্টের মেয়াদ নির্ধারণ করার জন্য ডকুমেন্ট তৈরির সময় কারণ সেট করা হয়। AUDIO_PLAYBACK কারণটি ৩০ সেকেন্ড পরে অডিও না বাজিয়েই ডকুমেন্ট বন্ধ করে দেয়। অন্যান্য সব কারণে লাইফটাইম সীমা সেট করা হয় না।

উদাহরণ

অফ-স্ক্রিন ডকুমেন্টের লাইফসাইকেল বজায় রাখা

নিচের উদাহরণ থেকে বোঝা যায় যে কীভাবে অফস্ক্রিন ডকুমেন্ট আছে কিনা তা নিশ্চিত করতে হয়। আগে থেকে থাকা অফস্ক্রিন ডকুমেন্ট খুঁজে পেতে setupOffscreenDocument() ফাংশন runtime.getContexts()-কে কল করে অথবা আগে থেকে না থাকলে ডকুমেন্ট তৈরি করে।

let creating; // A global promise to avoid concurrency issues
async function setupOffscreenDocument(path) {
  // Check all windows controlled by the service worker to see if one
  // of them is the offscreen document with the given path
  const offscreenUrl = browser.runtime.getURL(path);
  const existingContexts = await browser.runtime.getContexts({
    contextTypes: ['OFFSCREEN_DOCUMENT'],
    documentUrls: [offscreenUrl]
  });

  if (existingContexts.length > 0) {
    return;
  }

  // create offscreen document
  if (creating) {
    await creating;
  } else {
    creating = browser.offscreen.createDocument({
      url: path,
      reasons: ['CLIPBOARD'],
      justification: 'reason for needing the document',
    });
    await creating;
    creating = null;
  }
}

অফস্ক্রিন ডকুমেন্টে মেসেজ পাঠানোর আগে, ডকুমেন্টটি আছে কিনা তা নিশ্চিত করতে setupOffscreenDocument() কল করুন । এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

browser.action.onClicked.addListener(async () => {
  await setupOffscreenDocument('off_screen.html');

  // Send message to offscreen document
  browser.runtime.sendMessage({
    type: '...',
    target: 'offscreen',
    data: '...'
  });
});

সম্পূর্ণ উদাহরণের জন্য, GitHub-এ offscreen-clipboard এবং offscreen-dom ডেমো দেখুন।

Chrome 116-এর আগে: অফস্ক্রিন ডকুমেন্ট খোলা আছে কিনা চেক করুন

Chrome 116-এ runtime.getContexts() যোগ করা হয়েছে। Chrome-এর আগের ভার্সনে, আগে থেকে থাকা অফস্ক্রিন ডকুমেন্ট চেক করতে clients.matchAll() ব্যবহার করুন:

async function hasOffscreenDocument() {
  if ('getContexts' in browser.runtime) {
    const contexts = await browser.runtime.getContexts({
      contextTypes: ['OFFSCREEN_DOCUMENT'],
      documentUrls: [OFFSCREEN_DOCUMENT_PATH]
    });
    return Boolean(contexts.length);
  } else {
    const matchedClients = await clients.matchAll();
    return matchedClients.some(client => {
      return client.url.includes(browser.runtime.id);
    });
  }
}

ধরন

CreateParameters

প্রপার্টি

  • যুক্তি

    স্ট্রিং

    ডেভেলপার প্রদত্ত স্ট্রিং যা ব্যাকগ্রাউন্ড প্রসঙ্গ কেন প্রয়োজন তা আরও বিস্তারিতভাবে ব্যাখ্যা করে। ব্যবহারকারী এজেন্ট এটি ব্যবহারকারীকে দেখানোর জন্য ব্যবহার করতে _পারে_।

  • কারণ

    এক্সটেনশনটি অফস্ক্রিন ডকুমেন্ট তৈরি করার কারণ।

  • URL

    স্ট্রিং

    ডকুমেন্টে লোড করার জন্য (আপেক্ষিক) URL।

Reason

Enum

"TESTING"
A reason used for testing purposes only.

"AUDIO_PLAYBACK"
অফ-স্ক্রিন ডকুমেন্ট যে অডিও চালানোর জন্য দায়ী তা নির্দিষ্ট করে।

"IFRAME_SCRIPTING"
এর মাধ্যমে নির্দিষ্ট করা হয় যে iframe-এর কন্টেন্ট পরিবর্তন করার জন্য অফস্ক্রিন ডকুমেন্টকে iframe এম্বেড ও স্ক্রিপ্ট করতে হবে।

"DOM_SCRAPING"
অফস্ক্রিন ডকুমেন্টকে iframe এম্বেড করতে হবে এবং তথ্য এক্সট্র্যাক্ট করার জন্য এর DOM স্ক্র্যাপ করতে হবে তা নির্দিষ্ট করে।

"BLOBS"
অফস্ক্রিন ডকুমেন্টকে Blob অবজেক্টের (URL.createObjectURL() সহ) সাথে ইন্টার‍্যাক্ট করতে হবে বলে উল্লেখ করে।

"DOM_PARSER"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে DOMParser API ব্যবহার করতে হবে।

"USER_MEDIA"
অফ-স্ক্রিন ডকুমেন্টকে ব্যবহারকারীর মিডিয়া (যেমন, getUserMedia()) থেকে মিডিয়া স্ট্রিমের সাথে ইন্টার‍্যাক্ট করতে হবে বলে উল্লেখ করে।

"DISPLAY_MEDIA"
অফস্ক্রিন ডকুমেন্টকে ডিসপ্লে মিডিয়া (যেমন, getDisplayMedia()) থেকে মিডিয়া স্ট্রিমের সাথে ইন্টার‍্যাক্ট করতে হবে বলে উল্লেখ করে।

"WEB_RTC"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে WebRTC API ব্যবহার করতে হবে।

"CLIPBOARD"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে Clipboard API-এর সাথে ইন্টার‍্যাক্ট করতে হবে।

"LOCAL_STORAGE"
এর মাধ্যমে বোঝানো হয় যে অফস্ক্রিন ডকুমেন্টকে localStorage অ্যাক্সেস করতে হবে।

"WORKERS"
অফস্ক্রিন ডকুমেন্টকে ওয়ার্কার স্পন করতে হবে বলে উল্লেখ করে।

"BATTERY_STATUS"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে navigator.getBattery ব্যবহার করতে হবে।

"MATCH_MEDIA"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে window.matchMedia ব্যবহার করতে হবে।

"GEOLOCATION"
এটি নির্দিষ্ট করে যে অফস্ক্রিন ডকুমেন্টকে navigator.geolocation ব্যবহার করতে হবে।

পদ্ধতি

closeDocument()

chrome.offscreen.closeDocument(): Promise<void>

এক্সটেনশনের জন্য বর্তমানে খোলা অফস্ক্রিন ডকুমেন্ট বন্ধ করে দেয়।

রিটার্ন

  • Promise<void>

    অফস্ক্রিন ডকুমেন্ট বন্ধ হয়ে গেলে এই প্রমিস সম্পূর্ণ হয়ে যায়।

createDocument()

chrome.offscreen.createDocument(
  parameters: CreateParameters,
)
: Promise<void>

এক্সটেনশনের জন্য একটি নতুন অফস্ক্রিন ডকুমেন্ট তৈরি করে।

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

  • parameters

    তৈরি করার জন্য অফস্ক্রিন ডকুমেন্ট বর্ণনা করে এমন প্যারামিটার।

রিটার্ন

  • Promise<void>

    অফস্ক্রিন ডকুমেন্ট তৈরি হয়ে গেলে এবং প্রাথমিক পৃষ্ঠা লোড করা সম্পূর্ণ হলে, প্রমিসটি সম্পূর্ণ হয়ে যায়।

hasDocument()

Chrome 150+
chrome.offscreen.hasDocument(): Promise<boolean>

এক্সটেনশনের কোনও অ্যাক্টিভ ডকুমেন্ট আছে কিনা তা নির্ধারণ করে।

রিটার্ন

  • Promise<boolean>

    এক্সটেনশনের অ্যাক্টিভ অফস্ক্রিন ডকুমেন্ট আছে কিনা সেই ফলাফল সহ সমাধান করা প্রতিশ্রুতি।