ब्यौरा
स्क्रीन से बाहर के दस्तावेज़ बनाने और उन्हें मैनेज करने के लिए, offscreen API का इस्तेमाल करें.
अनुमतियां
offscreenOffscreen API का इस्तेमाल करने के लिए, एक्सटेंशन मेनिफ़ेस्ट में "offscreen" अनुमति का एलान करें. उदाहरण के लिए:
{
"name": "My extension",
...
"permissions": [
"offscreen"
],
...
}
उपलब्धता
कॉन्सेप्ट और इस्तेमाल
सर्विस वर्कर के पास DOM का ऐक्सेस नहीं होता. साथ ही, कई वेबसाइटों में कॉन्टेंट सुरक्षा नीतियां होती हैं. ये नीतियां, कॉन्टेंट स्क्रिप्ट की सुविधाओं को सीमित करती हैं. ऑफ़स्क्रीन एपीआई की मदद से एक्सटेंशन, छिपे हुए दस्तावेज़ में 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"
A reason used for testing purposes only.
"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>
यह प्रॉमिस तब पूरा होता है, जब ऑफ़स्क्रीन दस्तावेज़ बन जाता है और उसका शुरुआती पेज लोड पूरा हो जाता है.