ब्यौरा
स्क्रीन से बाहर के दस्तावेज़ बनाने और उन्हें मैनेज करने के लिए, offscreen
API का इस्तेमाल करें.
अनुमतियां
offscreen
Offscreen API का इस्तेमाल करने के लिए, एक्सटेंशन मेनिफ़ेस्ट में "offscreen"
अनुमति का एलान करें. उदाहरण के लिए:
{
"name": "My extension",
...
"permissions": [
"offscreen"
],
...
}
उपलब्धता
कॉन्सेप्ट और इस्तेमाल
सर्विस वर्कर के पास DOM का ऐक्सेस नहीं होता. साथ ही, कई वेबसाइटों में कॉन्टेंट सुरक्षा नीतियां होती हैं. ये नीतियां, कॉन्टेंट स्क्रिप्ट की सुविधाओं को सीमित करती हैं. Offscreen API की मदद से एक्सटेंशन, छिपे हुए दस्तावेज़ में DOM एपीआई का इस्तेमाल कर सकता है. इससे नई विंडो या टैब खोलने पर, उपयोगकर्ता अनुभव में कोई रुकावट नहीं आती. runtime
एपीआई, एक्सटेंशन का ऐसा एपीआई है जिसे सिर्फ़ ऑफ़स्क्रीन दस्तावेज़ों के साथ इस्तेमाल किया जा सकता है.
ऑफ़स्क्रीन दस्तावेज़ के तौर पर लोड किए गए पेजों को, एक्सटेंशन के अन्य पेजों से अलग तरीके से मैनेज किया जाता है.
एक्सटेंशन की अनुमतियां, ऑफ़स्क्रीन दस्तावेज़ों पर भी लागू होती हैं. हालांकि, एक्सटेंशन एपीआई को ऐक्सेस करने की सीमाएं होती हैं. उदाहरण के लिए, chrome.runtime
एपीआई ही ऐसा एक्सटेंशन एपीआई है जो ऑफ़स्क्रीन दस्तावेज़ों के साथ काम करता है. इसलिए, मैसेज भेजने की सुविधा को इस एपीआई के सदस्यों का इस्तेमाल करके मैनेज किया जाना चाहिए.
यहां बताया गया है कि ऑफ़स्क्रीन दस्तावेज़, सामान्य पेजों से किस तरह अलग होते हैं:
- ऑफ़स्क्रीन दस्तावेज़ का यूआरएल, एक्सटेंशन के साथ बंडल की गई स्टैटिक एचटीएमएल फ़ाइल होनी चाहिए.
- स्क्रीन पर न दिखने वाले दस्तावेज़ों पर फ़ोकस नहीं किया जा सकता.
- ऑफ़स्क्रीन दस्तावेज़,
window
का एक इंस्टेंस होता है. हालांकि, इसकीopener
प्रॉपर्टी की वैल्यू हमेशाnull
होती है. - एक्सटेंशन पैकेज में कई ऑफ़स्क्रीन दस्तावेज़ हो सकते हैं. हालांकि, इंस्टॉल किए गए एक्सटेंशन में एक बार में सिर्फ़ एक दस्तावेज़ खुला हो सकता है. अगर एक्सटेंशन, स्प्लिट मोड में चल रहा है और गुप्त मोड वाली प्रोफ़ाइल चालू है, तो सामान्य और गुप्त मोड वाली प्रोफ़ाइल, दोनों में एक-एक ऑफ़स्क्रीन दस्तावेज़ हो सकता है.
ऑफ़स्क्रीन दस्तावेज़ बनाने और बंद करने के लिए, chrome.offscreen.createDocument()
और chrome.offscreen.closeDocument()
का इस्तेमाल करें. createDocument()
के लिए, दस्तावेज़ का url
, वजह, और औचित्य बताना ज़रूरी है:
chrome.offscreen.createDocument({
url: 'off_screen.html',
reasons: ['CLIPBOARD'],
justification: 'reason for needing the document',
});
वजहें
मान्य वजहों की सूची देखने के लिए, वजहें सेक्शन देखें. दस्तावेज़ बनाने के दौरान, दस्तावेज़ के इस्तेमाल से जुड़ी सीमाएं तय की जाती हैं. इससे यह तय होता है कि दस्तावेज़ कब तक इस्तेमाल किया जा सकता है. AUDIO_PLAYBACK
वजह से, दस्तावेज़ 30 सेकंड के बाद बंद हो जाता है और आवाज़ नहीं सुनाई देती. अन्य सभी वजहों से, लाइफ़टाइम की सीमाएं सेट नहीं होती हैं.
उदाहरण
ऑफ़स्क्रीन दस्तावेज़ की लाइफ़साइकल बनाए रखना
यहां दिए गए उदाहरण में, यह पक्का करने का तरीका बताया गया है कि कोई ऑफ़स्क्रीन दस्तावेज़ मौजूद है. 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 = chrome.runtime.getURL(path);
const existingContexts = await chrome.runtime.getContexts({
contextTypes: ['OFFSCREEN_DOCUMENT'],
documentUrls: [offscreenUrl]
});
if (existingContexts.length > 0) {
return;
}
// create offscreen document
if (creating) {
await creating;
} else {
creating = chrome.offscreen.createDocument({
url: path,
reasons: ['CLIPBOARD'],
justification: 'reason for needing the document',
});
await creating;
creating = null;
}
}
स्क्रीन पर मौजूद नहीं किसी दस्तावेज़ को मैसेज भेजने से पहले, setupOffscreenDocument()
को कॉल करके पक्का करें कि वह दस्तावेज़ मौजूद है. इस उदाहरण में दिखाया गया है कि ऐसा कैसे किया जाता है.
chrome.action.onClicked.addListener(async () => {
await setupOffscreenDocument('off_screen.html');
// Send message to offscreen document
chrome.runtime.sendMessage({
type: '...',
target: 'offscreen',
data: '...'
});
});
सभी उदाहरणों के लिए, GitHub पर offscreen-clipboard और offscreen-dom डेमो देखें.
Chrome 116 से पहले के वर्शन में: यह देखना कि कोई ऑफ़स्क्रीन दस्तावेज़ खुला है या नहीं
runtime.getContexts()
को Chrome 116 में जोड़ा गया था. Chrome के पुराने वर्शन में, किसी मौजूदा ऑफ़स्क्रीन दस्तावेज़ की जांच करने के लिए, clients.matchAll()
का इस्तेमाल करें:
async function hasOffscreenDocument() {
if ('getContexts' in chrome.runtime) {
const contexts = await chrome.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(chrome.runtime.id);
});
}
}
टाइप
CreateParameters
प्रॉपर्टी
-
वजह
स्ट्रिंग
डेवलपर की ओर से दी गई स्ट्रिंग, जिसमें बैकग्राउंड कॉन्टेक्स्ट की ज़रूरत के बारे में ज़्यादा जानकारी दी गई हो. उपयोगकर्ता एजेंट, इसे उपयोगकर्ता को दिखाने के लिए इस्तेमाल _कर सकता है_.
-
वजहें
Reason[]
एक्सटेंशन, ऑफ़स्क्रीन दस्तावेज़ किस वजह से बना रहा है.
-
url
स्ट्रिंग
दस्तावेज़ में लोड करने के लिए (रिलेटिव) यूआरएल.
Reason
Enum
"TESTING"
इस वजह का इस्तेमाल सिर्फ़ जांच के लिए किया जाता है.
"AUDIO_PLAYBACK"
इससे पता चलता है कि ऑफ़स्क्रीन दस्तावेज़, ऑडियो चलाने के लिए ज़िम्मेदार है.
"IFRAME_SCRIPTING"
इससे पता चलता है कि iframe के कॉन्टेंट में बदलाव करने के लिए, ऑफ़स्क्रीन दस्तावेज़ को iframe को एम्बेड और स्क्रिप्ट करना होगा.
"DOM_SCRAPING"
इससे पता चलता है कि ऑफ़स्क्रीन दस्तावेज़ को iframe एम्बेड करने और जानकारी निकालने के लिए, उसके डीओएम को स्क्रैप करने की ज़रूरत है.
"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>
यह एक्सटेंशन के लिए, स्क्रीन से बाहर का नया दस्तावेज़ बनाता है.
पैरामीटर
-
पैरामीटर
स्क्रीन पर मौजूद दस्तावेज़ बनाने के बारे में बताने वाले पैरामीटर.
रिटर्न
-
Promise<void>