स्क्रीन कैप्चर एपीआई की मदद से, उपयोगकर्ता किसी टैब, विंडो या स्क्रीन को मीडिया स्ट्रीम के तौर पर कैप्चर कर सकता है. इसके बाद, इस स्ट्रीम को रिकॉर्ड किया जा सकता है या नेटवर्क पर दूसरों के साथ शेयर किया जा सकता है. इस दस्तावेज़ में 'कंडिशनल फ़ोकस' सुविधा के बारे में जानकारी दी गई है. यह वेब ऐप्लिकेशन की एक ऐसी सुविधा है जो यह कंट्रोल करती है कि कैप्चर किए गए टैब या विंडो को कैप्चर करते समय, फ़ोकस किया जाएगा या नहीं या कैप्चर करने वाले पेज पर फ़ोकस रहेगा या नहीं.
ब्राउज़र समर्थन
शर्त के हिसाब से फ़ोकस करने की सुविधा, Chrome 109 से उपलब्ध है.
बैकग्राउंड
जब कोई वेब ऐप्लिकेशन किसी टैब या विंडो को कैप्चर करना शुरू करता है, तो ब्राउज़र को यह तय करना होता है कि कैप्चर किए गए हिस्से को फ़ोरग्राउंड में लाया जाए या कैप्चर करने वाले पेज पर फ़ोकस बना रहे. इसका जवाब, getDisplayMedia()
को कॉल करने की वजह और उपयोगकर्ता के चुने गए प्लैटफ़ॉर्म पर निर्भर करता है.
किसी कल्पित वीडियो कॉन्फ़्रेंसिंग वेब ऐप्लिकेशन पर विचार करें. track.getSettings().displaySurface
को पढ़कर और कैप्चर हैंडल की जांच करके, वीडियो कॉन्फ़्रेंसिंग वेब ऐप्लिकेशन यह समझ सकता है कि उपयोगकर्ता ने क्या शेयर करने का विकल्प चुना है. इसके बाद:
- अगर कैप्चर किए गए टैब या विंडो को रिमोट से कंट्रोल किया जा सकता है, तो वीडियो कॉन्फ़्रेंस को फ़ोकस में रखें.
- अगर ऐसा नहीं है, तो कैप्चर किए गए टैब या विंडो पर फ़ोकस करें.
ऊपर दिए गए उदाहरण में, स्लाइड डेक शेयर करने पर, वीडियो कॉन्फ़्रेंसिंग वेब ऐप्लिकेशन पर फ़ोकस बना रहेगा. इससे उपयोगकर्ता, स्लाइड को रिमोट तौर पर फ़्लिप कर सकता है. हालांकि, अगर उपयोगकर्ता ने टेक्स्ट एडिटर शेयर करने का विकल्प चुना, तो वीडियो कॉन्फ़्रेंसिंग वेब ऐप्लिकेशन, फ़ोकस को कैप्चर किए गए टैब या विंडो पर तुरंत स्विच कर देगा.
स्थिति के हिसाब से फ़ोकस एपीआई का इस्तेमाल करना
CaptureController
को इंस्टैंशिएट करें और उसे getDisplayMedia()
को पास करें. getDiplayMedia()
से मिलने वाले प्रॉमिस के पूरा होने के तुरंत बाद setFocusBehavior()
को कॉल करके, यह कंट्रोल किया जा सकता है कि कैप्चर किए गए टैब या विंडो पर फ़ोकस किया जाए या नहीं. ऐसा सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता ने कोई टैब या विंडो शेयर की हो.
const controller = new CaptureController();
// Prompt the user to share a tab, a window or a screen.
const stream =
await navigator.mediaDevices.getDisplayMedia({ controller });
const [track] = stream.getVideoTracks();
const displaySurface = track.getSettings().displaySurface;
if (displaySurface == "browser") {
// Focus the captured tab.
controller.setFocusBehavior("focus-captured-surface");
} else if (displaySurface == "window") {
// Do not move focus to the captured window.
// Keep the capturing page focused.
controller.setFocusBehavior("focus-capturing-application");
}
फ़ोकस करने या न करने का फ़ैसला लेते समय, कैप्चर हैंडल को ध्यान में रखा जा सकता है.
// Retain focus if capturing a tab dialed to example.com.
// Focus anything else.
const origin = track.getCaptureHandle().origin;
if (displaySurface == "browser" && origin == "https://example.com") {
controller.setFocusBehavior("focus-capturing-application");
} else if (displaySurface != "monitor") {
controller.setFocusBehavior("focus-captured-surface");
}
यह भी तय किया जा सकता है कि getDisplayMedia()
को कॉल करने से पहले फ़ोकस करना है या नहीं.
// Focus the captured tab or window when capture starts.
const controller = new CaptureController();
controller.setFocusBehavior("focus-captured-surface");
// Prompt the user to share their screen.
const stream =
await navigator.mediaDevices.getDisplayMedia({ controller });
वादा पूरा होने से पहले, setFocusBehavior()
को जितनी बार चाहे उतनी बार कॉल किया जा सकता है. इसके अलावा, वादा पूरा होने के तुरंत बाद, इसे एक बार से ज़्यादा कॉल नहीं किया जा सकता. आखिरी बार किए गए अनुरोध, पहले किए गए सभी अनुरोधों को बदल देते हैं.
ज़्यादा सटीक तरीके से:
- getDisplayMedia()
से मिलने वाला प्रॉमिस, माइक्रोटास्क पर पूरा होता है. उस माइक्रोटास्क के पूरा होने के बाद, setFocusBehavior()
को कॉल करने पर गड़बड़ी का मैसेज दिखता है.
- कैप्चर शुरू होने के एक सेकंड बाद setFocusBehavior()
को कॉल करने से कोई कार्रवाई नहीं होती.
इसका मतलब है कि ये दोनों स्निपेट काम नहीं करेंगे:
// Prompt the user to share their screen.
const stream =
await navigator.mediaDevices.getDisplayMedia({ controller });
// Too late, because it follows the completion of the task
// on which the getDisplayMedia() promise resolved.
// This will throw.
setTimeout(() => {
controller.setFocusBehavior("focus-captured-surface");
});
// Prompt the user to share their screen.
const stream =
await navigator.mediaDevices.getDisplayMedia({ controller });
const start = new Date();
while (new Date() - start <= 1000) {
// Idle for ≈1s.
}
// Because too much time has elapsed, the browser will have
// already decided whether to focus.
// This fails silently.
controller.setFocusBehavior("focus-captured-surface");
setFocusBehavior()
को कॉल करने पर, इन स्थितियों में भी गड़बड़ी का मैसेज दिखता है:
getDisplayMedia()
से मिली स्ट्रीम का वीडियो ट्रैक "लाइव" नहीं है.getDisplayMedia()
से मिले प्रॉमिस के रिज़ॉल्व होने के बाद, अगर उपयोगकर्ता ने कोई स्क्रीन शेयर की है, तो टैब या विंडो नहीं.
नमूना
Glitch पर डेमो चलाकर, शर्तों के हिसाब से फ़ोकस करने की सुविधा को आज़माया जा सकता है. सोर्स कोड को देखना न भूलें.
फ़ीचर का पता लगाना
यह देखने के लिए कि CaptureController.setFocusBehavior()
काम करता है या नहीं, इनका इस्तेमाल करें:
if (
"CaptureController" in window &&
"setFocusBehavior" in CaptureController.prototype
) {
// CaptureController.setFocusBehavior() is supported.
}
सुझाव/राय दें या शिकायत करें
Chrome टीम और वेब स्टैंडर्ड का समुदाय, 'शर्त के साथ फ़ोकस' सुविधा इस्तेमाल करने के आपके अनुभवों के बारे में जानना चाहते हैं.
हमें डिज़ाइन के बारे में बताएं
क्या शर्त के हिसाब से फ़ोकस करने की सुविधा, आपकी उम्मीद के मुताबिक काम नहीं कर रही है? क्या आपके आइडिया को लागू करने के लिए, कोई तरीका या प्रॉपर्टी मौजूद नहीं है? क्या आपको सुरक्षा मॉडल के बारे में कोई सवाल पूछना है या कोई टिप्पणी करनी है?
- GitHub रेपो में, स्पेसिफ़िकेशन की समस्या दर्ज करें या किसी मौजूदा समस्या के बारे में अपनी राय दें.
क्या लागू करने में समस्या आ रही है?
क्या आपको Chrome को लागू करने में कोई गड़बड़ी मिली? या क्या इसे लागू करने का तरीका, खास जानकारी से अलग है?
- https://new.crbug.com पर जाकर, गड़बड़ी की शिकायत करें. इसमें ज़्यादा से ज़्यादा जानकारी शामिल करें. साथ ही, गड़बड़ी को दोहराने के लिए आसान निर्देश दें. कोड शेयर करने के लिए, Glitch सही तरीके से काम करता है.
सपोर्ट करें
क्या आपको शर्त के हिसाब से फ़ोकस करने की सुविधा का इस्तेमाल करना है? सार्वजनिक तौर पर सहायता करने से, Chrome की टीम को सुविधाओं को प्राथमिकता देने में मदद मिलती है. साथ ही, इससे अन्य ब्राउज़र वेंडर को यह पता चलता है कि इन सुविधाओं को उपलब्ध कराना कितना ज़रूरी है.
@ChromiumDev को ट्वीट करें और हमें बताएं कि इसका इस्तेमाल कहां और कैसे किया जा रहा है.
मददगार लिंक
धन्यवाद
Elena Taranenko की हीरो इमेज.
इस लेख की समीक्षा करने के लिए, रेचल एंड्रयू का धन्यवाद.