chrome.offscreen

Açıklama

Ekran dışı dokümanlar oluşturmak ve yönetmek için offscreen API'yi kullanın.

İzinler

offscreen

Offscreen API'yi kullanmak için "offscreen" iznini uzantı manifestinde bildirin. Örneğin:

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

Kullanılabilirlik

Chrome 109+ MV3+

Kavramlar ve kullanım

Service worker'lar DOM erişimine sahip değildir ve birçok web sitesinde içerik komut dosyalarının işlevselliğini sınırlayan içerik güvenlik politikaları bulunur. Offscreen API, uzantının yeni pencereler veya sekmeler açarak kullanıcı deneyimini kesintiye uğratmadan DOM API'lerini gizli bir dokümanda kullanmasına olanak tanır. runtime API, ekran dışı dokümanlar tarafından desteklenen tek uzantı API'sidir.

Ekran dışında dokümanlar olarak yüklenen sayfalar, diğer uzantı sayfası türlerinden farklı şekilde işlenir. Uzantının izinleri, ekran dışı dokümanlara da aktarılır ancak uzantı API'sine erişim sınırlıdır. Örneğin, chrome.runtime API, ekran dışı dokümanlar tarafından desteklenen tek uzantı API'si olduğundan mesajlaşma, bu API'nin üyeleri kullanılarak yapılmalıdır.

Ekran dışı dokümanların normal sayfalardan farklı davrandığı diğer durumlar şunlardır:

  • Ekran dışında kalan bir dokümanın URL'si, uzantıyla birlikte paketlenmiş statik bir HTML dosyası olmalıdır.
  • Ekran dışında kalan dokümanlara odaklanılamaz.
  • Ekran dışı belge, window örneğidir ancak opener özelliğinin değeri her zaman null olur.
  • Bir uzantı paketi birden fazla ekran dışı belge içerebilse de, yüklenen bir uzantı aynı anda yalnızca bir belge açabilir. Uzantı, etkin bir gizli profil ile bölünmüş modda çalışıyorsa normal ve gizli profillerin her birinde birer tane ekran dışı doküman olabilir.

Ekran dışı bir doküman oluşturup kapatmak için chrome.offscreen.createDocument() ve chrome.offscreen.closeDocument() kullanın. createDocument() için belgenin url, bir neden ve bir gerekçe gerekir:

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

Nedenler

Geçerli nedenlerin listesi için Nedenler bölümüne bakın. Nedenler, belgenin kullanım ömrünü belirlemek için belge oluşturma sırasında ayarlanır. AUDIO_PLAYBACK nedeni, belgeyi 30 saniye sonra ses çalmadan kapanacak şekilde ayarlar. Diğer tüm nedenler, yaşam boyu sınırları ayarlamaz.

Örnekler

Ekran dışı bir dokümanın yaşam döngüsünü sürdürme

Aşağıdaki örnekte, ekran dışında bir belgenin varlığının nasıl sağlanacağı gösterilmektedir. setupOffscreenDocument() işlevi, mevcut bir ekran dışı dokümanı bulmak için runtime.getContexts() işlevini çağırır veya doküman mevcut değilse dokümanı oluşturur.

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

Ekranda görünmeyen bir dokümana mesaj göndermeden önce, aşağıdaki örnekte gösterildiği gibi dokümanın mevcut olduğundan emin olmak için setupOffscreenDocument() işlevini çağırın.

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

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

Eksiksiz örnekler için GitHub'daki offscreen-clipboard ve offscreen-dom demolarına bakın.

Chrome 116'dan önce: Ekran dışında bir dokümanın açık olup olmadığını kontrol etme

runtime.getContexts(), Chrome 116'da eklendi. Chrome'un önceki sürümlerinde, ekran dışında mevcut bir doküman olup olmadığını kontrol etmek için clients.matchAll() simgesini kullanın:

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

Türler

CreateParameters

Özellikler

  • gerekçe

    dize

    Geliştirici tarafından sağlanan ve arka plan bağlamının neden gerekli olduğunu daha ayrıntılı olarak açıklayan dize. Kullanıcı aracısı, bunu kullanıcıya gösterirken kullanabilir.

  • neden

    Uzantının ekran dışı doküman oluşturma nedeni.

  • url

    dize

    Belgeye yüklenecek (göreli) URL.

Reason

Enum

"TESTING"
Yalnızca test amacıyla kullanılan bir neden.

"AUDIO_PLAYBACK"
Ekran dışındaki dokümanın ses çalmaktan sorumlu olduğunu belirtir.

"IFRAME_SCRIPTING"
Ekran dışı belgenin, iFrame'in içeriğini değiştirmek için iFrame'i yerleştirmesi ve komut dosyası oluşturması gerektiğini belirtir.

"DOM_SCRAPING"
Ekran dışındaki dokümanın, bilgi ayıklamak için bir iFrame yerleştirmesi ve DOM'unu kazıması gerektiğini belirtir.

"BLOBS"
Ekran dışındaki belgenin Blob nesneleriyle (URL.createObjectURL() dahil) etkileşime girmesi gerektiğini belirtir.

"DOM_PARSER"
Ekran dışındaki dokümanın DOMParser API'yi kullanması gerektiğini belirtir.

"USER_MEDIA"
Ekran dışındaki belgenin, kullanıcı medyası (ör. getUserMedia()) medya akışlarıyla etkileşime girmesi gerektiğini belirtir.

"DISPLAY_MEDIA"
Ekran dışındaki belgenin, görüntülü reklam ortamlarındaki medya yayınlarıyla (ör. getDisplayMedia()) etkileşime girmesi gerektiğini belirtir.

"WEB_RTC"
Ekran dışı dokümanın WebRTC API'lerini kullanması gerektiğini belirtir.

"CLIPBOARD"
Ekran dışındaki dokümanın Pano API ile etkileşime girmesi gerektiğini belirtir.

"LOCAL_STORAGE"
Ekran dışı belgenin localStorage'a erişmesi gerektiğini belirtir.

"WORKERS"
Ekran dışı belgenin çalışan oluşturması gerektiğini belirtir.

"BATTERY_STATUS"
Ekran dışındaki dokümanın navigator.getBattery kullanması gerektiğini belirtir.

"MATCH_MEDIA"
Ekran dışında kalan dokümanın window.matchMedia kullanması gerektiğini belirtir.

"GEOLOCATION"
Ekran dışında kalan dokümanın navigator.geolocation kullanması gerektiğini belirtir.

Yöntemler

closeDocument()

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

Uzantı için şu anda açık olan ekran dışı dokümanı kapatır.

İadeler

  • Promise<void>

createDocument()

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

Uzantı için yeni bir ekran dışı doküman oluşturur.

Parametreler

  • parametreler

    Oluşturulacak ekran dışı dokümanı açıklayan parametreler.

İadeler

  • Promise<void>