chrome.offscreen

Descrizione

Utilizza l'API offscreen per creare e gestire documenti fuori schermo.

Autorizzazioni

offscreen

Per utilizzare l'API Offscreen, dichiara l'autorizzazione "offscreen" nel manifest dell'estensione. Ad esempio:

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

Disponibilità

Chrome 109+ MV3+

Concetti e utilizzo

I service worker non hanno accesso al DOM e molti siti web hanno policy di sicurezza dei contenuti che limitano la funzionalità degli script di contenuti. L'API Offscreen consente all'estensione di utilizzare le API DOM in un documento nascosto senza interrompere l'esperienza utente aprendo nuove finestre o schede. L'API runtime è l'unica API delle estensioni supportata dai documenti offscreen.

Le pagine caricate come documenti fuori schermo vengono gestite in modo diverso rispetto ad altri tipi di pagine di estensione. Le autorizzazioni dell'estensione vengono trasferite ai documenti fuori schermo, ma con limiti di accesso all'API dell'estensione. Ad esempio, poiché l'API chrome.runtime è l'unica API di estensione supportata dai documenti off-screen, la messaggistica deve essere gestita utilizzando i membri di questa API.

Di seguito sono riportati altri modi in cui i documenti fuori schermo si comportano in modo diverso dalle pagine normali:

  • L'URL di un documento offscreen deve essere un file HTML statico incluso nell'estensione.
  • Non è possibile mettere a fuoco i documenti fuori dallo schermo.
  • Un documento fuori schermo è un'istanza di window, ma il valore della relativa proprietà opener è sempre null.
  • Sebbene un pacchetto di estensioni possa contenere più documenti fuori schermo, un'estensione installata può averne aperto solo uno alla volta. Se l'estensione è in esecuzione in modalità split con un profilo di navigazione in incognito attivo, i profili normale e di navigazione in incognito possono avere ciascuno un documento fuori schermo.

Utilizza chrome.offscreen.createDocument() e chrome.offscreen.closeDocument() per creare e chiudere un documento fuori schermo. createDocument() richiede url del documento, un motivo e una giustificazione:

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

Motivi

Per un elenco dei motivi validi, consulta la sezione Motivi. I motivi vengono impostati durante la creazione del documento per determinarne la durata. Il motivo AUDIO_PLAYBACK imposta la chiusura del documento dopo 30 secondi senza riproduzione audio. Tutti gli altri motivi non impostano limiti a vita.

Esempi

Mantenere il ciclo di vita di un documento fuori schermo

L'esempio seguente mostra come assicurarsi che esista un documento fuori schermo. La funzione setupOffscreenDocument() chiama runtime.getContexts() per trovare un documento fuori schermo esistente o crea il documento se non esiste già.

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

Prima di inviare un messaggio a un documento fuori schermo, chiama setupOffscreenDocument() per assicurarti che il documento esista, come mostrato nell'esempio seguente.

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

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

Per esempi completi, consulta le demo offscreen-clipboard e offscreen-dom su GitHub.

Prima di Chrome 116: controllare se è aperto un documento fuori schermo

runtime.getContexts() è stato aggiunto in Chrome 116. Nelle versioni precedenti di Chrome, utilizza clients.matchAll() per verificare la presenza di un documento fuori schermo esistente:

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

Tipi

CreateParameters

Proprietà

  • giustificazione

    stringa

    Una stringa fornita dallo sviluppatore che spiega in modo più dettagliato la necessità del contesto in background. Lo user agent _potrebbe_ utilizzarlo nella visualizzazione per l'utente.

  • motivi

    Il motivo o i motivi per cui l'estensione sta creando il documento fuori schermo.

  • url

    stringa

    L'URL (relativo) da caricare nel documento.

Reason

Enum

"TESTING"
Un motivo utilizzato solo a scopo di test.

"AUDIO_PLAYBACK"
Specifica che il documento fuori schermo è responsabile della riproduzione dell'audio.

"IFRAME_SCRIPTING"
Specifica che il documento offscreen deve incorporare e creare uno script per un iframe per modificare i contenuti dell'iframe.

"DOM_SCRAPING"
Specifica che il documento fuori schermo deve incorporare un iframe e analizzare il relativo DOM per estrarre informazioni.

"BLOBS"
Specifica che il documento fuori schermo deve interagire con gli oggetti Blob (incluso URL.createObjectURL()).

"DOM_PARSER"
Specifica che il documento fuori schermo deve utilizzare l'API DOMParser.

"USER_MEDIA"
Specifica che il documento fuori schermo deve interagire con i flussi multimediali dei contenuti multimediali dell'utente (ad es. getUserMedia()).

"DISPLAY_MEDIA"
Specifica che il documento fuori schermo deve interagire con i flussi multimediali dei contenuti multimediali display (ad es. getDisplayMedia()).

"WEB_RTC"
Specifica che il documento fuori schermo deve utilizzare le API WebRTC.

"CLIPBOARD"
Specifica che il documento fuori schermo deve interagire con l'API Clipboard.

"LOCAL_STORAGE"
Specifica che il documento fuori schermo deve accedere a localStorage.

"WORKERS"
Specifica che il documento fuori schermo deve generare worker.

"BATTERY_STATUS"
Specifica che il documento fuori schermo deve utilizzare navigator.getBattery.

"MATCH_MEDIA"
Specifica che il documento fuori schermo deve utilizzare window.matchMedia.

"GEOLOCATION"
Specifica che il documento fuori schermo deve utilizzare navigator.geolocation.

Metodi

closeDocument()

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

Chiude il documento fuori schermo attualmente aperto per l'estensione.

Resi

  • Promise<void>

createDocument()

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

Crea un nuovo documento fuori schermo per l'estensione.

Parametri

  • Parametri

    I parametri che descrivono il documento fuori schermo da creare.

Resi

  • Promise<void>