chrome.offscreen

Deskripsi

Gunakan offscreen API untuk membuat dan mengelola dokumen offscreen.

Izin

offscreen

Untuk menggunakan Offscreen API, deklarasikan izin "offscreen" dalam manifes ekstensi. Contoh:

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

Ketersediaan

Chrome 109+ MV3+

Konsep dan penggunaan

Service worker tidak memiliki akses DOM, dan banyak situs memiliki kebijakan keamanan konten yang membatasi fungsi skrip konten. Offscreen API memungkinkan ekstensi menggunakan DOM API dalam dokumen tersembunyi tanpa mengganggu pengalaman pengguna dengan membuka jendela atau tab baru. The runtime API adalah satu-satunya ekstensi API yang didukung oleh dokumen offscreen.

Halaman yang dimuat sebagai dokumen offscreen ditangani secara berbeda dari jenis halaman ekstensi lainnya. Izin ekstensi diteruskan ke dokumen offscreen, tetapi dengan batasan pada akses ekstensi API. Misalnya, karena chrome.runtime API adalah satu-satunya ekstensi API yang didukung oleh dokumen offscreen, pesan harus ditangani menggunakan anggota API tersebut.

Berikut adalah cara lain dokumen offscreen berperilaku berbeda dari halaman normal:

  • URL dokumen offscreen harus berupa file HTML statis yang disertakan dengan ekstensi.
  • Dokumen offscreen tidak dapat difokuskan.
  • Dokumen offscreen adalah instance window, tetapi nilai properti opener selalu null.
  • Meskipun paket ekstensi dapat berisi beberapa dokumen offscreen, ekstensi yang diinstal hanya dapat memiliki satu yang terbuka dalam satu waktu. Jika ekstensi berjalan dalam mode terpisah dengan profil samaran yang aktif, profil normal dan samaran masing-masing dapat memiliki satu dokumen offscreen.

Gunakan chrome.offscreen.createDocument() dan chrome.offscreen.closeDocument() untuk membuat dan menutup dokumen offscreen. createDocument() memerlukan url dokumen, alasan, dan justifikasi:

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

Alasan

Untuk mengetahui daftar alasan yang valid, lihat bagian Alasan. Alasan ditetapkan selama pembuatan dokumen untuk menentukan masa aktif dokumen. Alasan AUDIO_PLAYBACK menetapkan dokumen untuk ditutup setelah 30 detik tanpa audio diputar. Semua alasan lainnya tidak menetapkan batas masa aktif.

Contoh

Mempertahankan siklus proses dokumen offscreen

Contoh berikut menunjukkan cara memastikan dokumen offscreen ada. Fungsi setupOffscreenDocument() memanggil runtime.getContexts() untuk menemukan dokumen offscreen yang ada, atau membuat dokumen jika belum ada.

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;
  }
}

Sebelum mengirim pesan ke dokumen offscreen, panggil setupOffscreenDocument() untuk memastikan dokumen ada, seperti yang ditunjukkan dalam contoh berikut.

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

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

Untuk contoh lengkap, lihat demo offscreen-clipboard dan offscreen-dom di GitHub.

Sebelum Chrome 116: memeriksa apakah dokumen offscreen terbuka

runtime.getContexts() ditambahkan di Chrome 116. Di Chrome versi sebelumnya, gunakan clients.matchAll() untuk memeriksa dokumen offscreen yang ada:

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);
    });
  }
}

Jenis

CreateParameters

Properti

  • justification

    string

    String yang disediakan developer yang menjelaskan, secara lebih mendetail, kebutuhan akan konteks latar belakang. User agent _dapat_ menggunakan string ini dalam tampilan kepada pengguna.

  • reasons

    Alasan ekstensi membuat dokumen offscreen.

  • url

    string

    URL (relatif) yang akan dimuat dalam dokumen.

Reason

Enum

"TESTING"
Alasan yang hanya digunakan untuk tujuan pengujian.

"AUDIO_PLAYBACK"
Menentukan bahwa dokumen offscreen bertanggung jawab untuk memutar audio.

"IFRAME_SCRIPTING"
Menentukan bahwa dokumen offscreen perlu menyematkan dan membuat skrip iframe untuk mengubah konten iframe.

"DOM_SCRAPING"
Menentukan bahwa dokumen offscreen perlu menyematkan iframe dan meng-scrap DOM-nya untuk mengekstrak informasi.

"BLOBS"
Menentukan bahwa dokumen offscreen perlu berinteraksi dengan objek Blob (termasuk URL.createObjectURL()).

"DOM_PARSER"
Menentukan bahwa dokumen offscreen perlu menggunakan DOMParser API.

"USER_MEDIA"
Menentukan bahwa dokumen offscreen perlu berinteraksi dengan aliran media dari media pengguna (misalnya, getUserMedia()).

"DISPLAY_MEDIA"
Menentukan bahwa dokumen offscreen perlu berinteraksi dengan aliran media dari media tampilan (misalnya, getDisplayMedia()).

"WEB_RTC"
Menentukan bahwa dokumen offscreen perlu menggunakan WebRTC API.

"CLIPBOARD"
Menentukan bahwa dokumen offscreen perlu berinteraksi dengan Clipboard API.

"LOCAL_STORAGE"
Menentukan bahwa dokumen offscreen memerlukan akses ke localStorage.

"WORKERS"
Menentukan bahwa dokumen offscreen perlu membuat worker.

"BATTERY_STATUS"
Menentukan bahwa dokumen offscreen perlu menggunakan navigator.getBattery.

"MATCH_MEDIA"
Menentukan bahwa dokumen offscreen perlu menggunakan window.matchMedia.

"GEOLOCATION"
Menentukan bahwa dokumen offscreen perlu menggunakan navigator.geolocation.

Metode

closeDocument()

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

Menutup dokumen offscreen yang saat ini terbuka untuk ekstensi.

Hasil

  • Promise<void>

    Promise yang diselesaikan saat dokumen offscreen telah ditutup.

createDocument()

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

Membuat dokumen offscreen baru untuk ekstensi.

Parameter

  • parameters

    Parameter yang menjelaskan dokumen offscreen yang akan dibuat.

Hasil

  • Promise<void>

    Promise yang diselesaikan saat dokumen offscreen dibuat dan telah menyelesaikan pemuatan halaman awal.

hasDocument()

Tertunda
chrome.offscreen.hasDocument(): Promise<boolean>

Menentukan apakah ekstensi memiliki dokumen aktif.

Hasil

  • Promise<boolean>

    Promise yang diselesaikan dengan hasil apakah ekstensi memiliki dokumen offscreen yang aktif.