الوصف
استخدِم واجهة برمجة التطبيقات offscreen لإنشاء مستندات خارج الشاشة وإدارتها.
الأذونات
offscreenلاستخدام Offscreen API، عليك الإفصاح عن إذن "offscreen" في بيان الإضافة. على سبيل المثال:
{
"name": "My extension",
...
"permissions": [
"offscreen"
],
...
}
مدى التوفّر
المفاهيم والاستخدام
لا يمكن للعاملين في الخدمة الوصول إلى نموذج العناصر في المستند (DOM)، وتتضمّن العديد من المواقع الإلكترونية سياسات أمان المحتوى التي تحدّ من وظائف النصوص البرمجية للمحتوى. تسمح Offscreen API للإضافة باستخدام واجهات برمجة تطبيقات DOM في مستند مخفي بدون التأثير سلبًا في تجربة المستخدم من خلال فتح نوافذ أو علامات تبويب جديدة. runtime API هي واجهة برمجة التطبيقات الوحيدة للإضافات
التي تتوافق مع المستندات خارج الشاشة.
تتم معالجة الصفحات التي يتم تحميلها كمستندات خارج الشاشة بشكل مختلف عن أنواع صفحات الإضافات الأخرى.
يتم نقل أذونات الإضافة إلى المستندات خارج الشاشة، ولكن مع فرض قيود على الوصول إلى واجهة برمجة التطبيقات للإضافات. على سبيل المثال، بما أنّ chrome.runtime API هي واجهة برمجة التطبيقات الوحيدة
للإضافات التي تتوافق مع المستندات خارج الشاشة، يجب معالجة الرسائل
باستخدام عناصر واجهة برمجة التطبيقات هذه.
في ما يلي طرق أخرى يختلف فيها سلوك المستندات خارج الشاشة عن الصفحات العادية:
- يجب أن يكون عنوان URL لمستند خارج الشاشة ملف HTML ثابتًا مجمّعًا مع الإضافة.
- لا يمكن التركيز على المستندات خارج الشاشة.
- المستند خارج الشاشة هو مثال على
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: '...'
});
});
للاطّلاع على أمثلة كاملة، راجِع العرضَين التوضيحيَين offscreen-clipboard و offscreen-dom على GitHub.
قبل 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
الخصائص
-
justification
سلسلة
سلسلة يقدّمها المطوّر وتوضّح بالتفصيل الحاجة إلى سياق الخلفية. قد يستخدم وكيل المستخدم هذه السلسلة لعرضها للمستخدم.
-
reasons
Reason[]
الأسباب التي تدفع الإضافة إلى إنشاء المستند خارج الشاشة.
-
url
سلسلة
عنوان URL (نسبي) للمستند المطلوب تحميله.
Reason
تعداد
"اختبار"
سبب يُستخدم لأغراض الاختبار فقط.
"AUDIO_PLAYBACK"
يشير إلى أنّ المستند خارج الشاشة مسؤول عن تشغيل الصوت.
"IFRAME_SCRIPTING"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى تضمين إطار iframe وكتابة نص برمجي له لتعديل محتواه.
"DOM_SCRAPING"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى تضمين إطار iframe وكشط نموذج العناصر في المستند (DOM) لاستخراج المعلومات.
"BLOBS"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى التفاعل مع كائنات Blob (بما في ذلك URL.createObjectURL()).
"DOM_PARSER"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى استخدام DOMParser API.
"USER_MEDIA"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى التفاعل مع بثوق الوسائط من وسائط المستخدم (مثل getUserMedia()).
"DISPLAY_MEDIA"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى التفاعل مع بثوق الوسائط من وسائط العرض (مثل getDisplayMedia()).
"WEB_RTC"
يشير إلى أنّ المستند خارج الشاشة يحتاج إلى استخدام WebRTC APIs.
"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.offscreen.hasDocument(): Promise<boolean>
يحدّد ما إذا كانت الإضافة تتضمّن مستندًا نشطًا.
المرتجعات
-
Promise<boolean>
وعد يتم تنفيذه مع نتيجة ما إذا كانت الإضافة تتضمّن مستندًا نشطًا خارج الشاشة.