Açıklama
Farklı bağlamlarda komut dosyası yürütmek için chrome.scripting API'yi kullanın.
İzinler
scriptingKullanılabilirlik
Manifest
chrome.scripting API'sini kullanmak için manifest dosyasında "scripting" iznini ve komut dosyalarının ekleneceği sayfalar için ana makine izinlerini beyan edin. "host_permissions" tuşunu veya geçici ana makine izinleri veren "activeTab" iznini kullanın. Aşağıdaki örnekte activeTab izni kullanılmaktadır.
{
  "name": "Scripting Extension",
  "manifest_version": 3,
  "permissions": ["scripting", "activeTab"],
  ...
}
Kavramlar ve kullanım
Web sitelerine JavaScript ve CSS eklemek için chrome.scripting API'sini kullanabilirsiniz. Bu, içerik komut dosyaları ile yapabileceklerinize benzer. Ancak uzantılar, chrome.scripting ad alanını kullanarak çalışma zamanında kararlar verebilir.
Enjeksiyon hedefleri
JavaScript veya CSS'nin ekleneceği bir hedef belirtmek için target parametresini kullanabilirsiniz.
Tek zorunlu alan tabId'dır. Varsayılan olarak, bir yerleştirme işlemi belirtilen sekmenin ana çerçevesinde çalışır.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected"));
Belirtilen sekmenin tüm çerçevelerinde çalışması için allFrames boolean
değerini true olarak ayarlayabilirsiniz.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected in all frames"));
Ayrıca, tek tek çerçeve kimliklerini belirterek bir sekmenin belirli çerçevelerine de yerleştirebilirsiniz. Çerçeve kimlikleri hakkında daha fazla bilgi için chrome.webNavigation
API başlıklı makaleyi inceleyin.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected on target frames"));
Yerleştirilmiş kod
Uzantılar, eklenecek kodu harici bir dosya veya çalışma zamanı değişkeni aracılığıyla belirtebilir.
Dosyalar
Dosyalar, uzantının kök dizinine göre yollar olan dizeler olarak belirtilir. Aşağıdaki kod, script.js dosyasını sekmenin ana çerçevesine yerleştirir.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("injected script file"));
Çalışma zamanı işlevleri
scripting.executeScript() ile JavaScript yerleştirirken dosya yerine yürütülecek bir işlev belirtebilirsiniz. Bu işlev, mevcut uzantı bağlamında kullanılabilen bir işlev değişkeni olmalıdır.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : getTitle,
    })
    .then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
  document.body.style.backgroundColor = getUserColor();
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
    })
    .then(() => console.log("injected a function"));
args özelliğini kullanarak bu sorunu çözebilirsiniz:
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
  document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
      args : [ getUserColor() ],
    })
    .then(() => console.log("injected a function"));
Çalışma zamanı dizeleri
Bir sayfaya CSS ekliyorsanız css özelliğinde kullanılacak bir dize de belirtebilirsiniz. Bu seçenek yalnızca scripting.insertCSS() için kullanılabilir. scripting.executeScript() kullanarak bir dize yürütemezsiniz.
function getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting
    .insertCSS({
      target : {tabId : getTabId()},
      css : css,
    })
    .then(() => console.log("CSS injected"));
Sonuçları işleme
JavaScript'in yürütülmesinin sonuçları uzantıya iletilir. Her kareye tek bir sonuç dahil edilir. Ana karenin, sonuç dizisindeki ilk dizin olduğu garanti edilir. Diğer tüm kareler ise belirlenmemiş bir sırada yer alır.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : getTitle,
    })
    .then(injectionResults => {
      for (const {frameId, result} of injectionResults) {
        console.log(`Frame ${frameId} result:`, result);
      }
    });
scripting.insertCSS() herhangi bir sonuç döndürmüyor.
Sözler
Komut dosyası yürütme sonucunda elde edilen değer bir söz ise Chrome, sözün yerine getirilmesini bekler ve sonuçta elde edilen değeri döndürür.
function getTabId() { ... }
async function addIframe() {
  const iframe = document.createElement("iframe");
  const loadComplete =
      new Promise(resolve => iframe.addEventListener("load", resolve));
  iframe.src = "https://example.com";
  document.body.appendChild(iframe);
  await loadComplete;
  return iframe.contentWindow.document.title;
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : addIframe,
    })
    .then(injectionResults => {
      for (const frameResult of injectionResults) {
        const {frameId, result} = frameResult;
        console.log(`Frame ${frameId} result:`, result);
      }
    });
Örnekler
Tüm dinamik içerik komut dosyalarının kaydını silme
Aşağıdaki snippet, uzantının daha önce kaydettiği tüm dinamik içerik komut dosyalarının kaydını silen bir işlev içerir.
async function unregisterAllDynamicContentScripts() {
  try {
    const scripts = await chrome.scripting.getRegisteredContentScripts();
    const scriptIds = scripts.map(script => script.id);
    return chrome.scripting.unregisterContentScripts({ ids: scriptIds });
  } catch (error) {
    const message = [
      "An unexpected error occurred while",
      "unregistering dynamic content scripts.",
    ].join(" ");
    throw new Error(message, {cause : error});
  }
}
chrome.scripting API'sini denemek için Chrome uzantısı örnekleri deposundan komut dosyası örneğini yükleyin.
Türler
ContentScriptFilter
Özellikler
- 
    idsstring[] isteğe bağlı Belirtilirse getRegisteredContentScriptsyalnızca bu listede kimliği belirtilen komut dosyalarını döndürür.
CSSInjection
Özellikler
- 
    cssdize isteğe bağlı Eklenecek CSS'yi içeren bir dize. Tam olarak bir filesvecssbelirtilmelidir.
- 
    dosyalarstring[] isteğe bağlı Eklenecek CSS dosyalarının yolu (uzantının kök dizinine göre). Tam olarak bir filesvecssbelirtilmelidir.
- 
    kaynakStyleOrigin isteğe bağlı Ekleme için stil kaynağı. Varsayılan olarak 'AUTHOR'değerine ayarlanır.
- 
    hedefCSS'nin ekleneceği hedefi belirten ayrıntılar. 
ExecutionWorld
Bir komut dosyasının içinde yürütüleceği JavaScript dünyası.
Enum
"ISOLATED" 
 Bu uzantıya özgü yürütme ortamı olan izole dünyayı belirtir.
"MAIN" 
 DOM'un ana dünyasını belirtir. Bu, ana sayfanın JavaScript'iyle paylaşılan yürütme ortamıdır.
InjectionResult
Özellikler
- 
    documentIddize Chrome 106 ve sonraki sürümlerEkleme işlemiyle ilişkili doküman. 
- 
    frameIdsayı Chrome 90 veya daha yeni bir sürümEkleme ile ilişkili çerçeve. 
- 
    sonuçherhangi bir isteğe bağlı Komut dosyası yürütme sonucu. 
InjectionTarget
Özellikler
- 
    allFramesboolean isteğe bağlı Komut dosyasının sekmedeki tüm çerçevelere eklenip eklenmeyeceği. Varsayılan olarak false değerine ayarlanır. frameIdsbelirtilmişse bu doğru olmamalıdır.
- 
    documentIdsstring[] isteğe bağlı Chrome 106 ve sonraki sürümlerİçine yerleştirilecek belirli documentId'lerin kimlikleri. frameIdsayarlandıysa bu ayarlanmamalıdır.
- 
    frameIdsnumber[] isteğe bağlı Enjekte edilecek belirli çerçevelerin kimlikleri. 
- 
    tabIdsayı Eklenecek sekmenin kimliği. 
RegisteredContentScript
Özellikler
- 
    allFramesboolean isteğe bağlı Doğru olarak belirtilirse sekmedeki en üstteki çerçeve olmasa bile tüm çerçevelere yerleştirilir. Her çerçeve, URL koşulları açısından bağımsız olarak kontrol edilir. URL koşulları karşılanmazsa alt çerçevelere yerleştirilmez. Varsayılan olarak false değerini alır. Bu durumda yalnızca üst çerçeve eşleştirilir. 
- 
    cssstring[] isteğe bağlı Eşleşen sayfalara yerleştirilecek CSS dosyalarının listesi. Bunlar, bu dizide göründükleri sırayla, sayfa için herhangi bir DOM oluşturulmadan veya görüntülenmeden önce yerleştirilir. 
- 
    excludeMatchesstring[] isteğe bağlı Bu içerik komut dosyasının aksi takdirde içine yerleştirileceği sayfaları hariç tutar. Bu dizelerin söz dizimi hakkında daha fazla bilgi için Eşleşme Kalıpları bölümüne bakın. 
- 
    iddize API çağrısında belirtilen içerik komut dosyasının kimliği. Oluşturulan komut dosyası kimlikleri için ön ek olarak ayrıldığından "_" ile başlamamalıdır. 
- 
    jsstring[] isteğe bağlı Eşleşen sayfalara yerleştirilecek JavaScript dosyalarının listesi. Bunlar, bu dizide göründükleri sırayla yerleştirilir. 
- 
    matchOriginAsFallbackboolean isteğe bağlı Chrome 119 veya daha yeni bir sürümURL'nin desteklenmeyen bir şema (ör. about:, data:, blob: veya filesystem:) içerdiği çerçevelere komut dosyasının eklenip eklenemeyeceğini belirtir. Bu gibi durumlarda, komut dosyasının yerleştirilip yerleştirilmeyeceğini belirlemek için URL'nin kaynağı kontrol edilir. Kaynak nullise (data: URL'lerinde olduğu gibi) kullanılan kaynak, mevcut çerçeveyi oluşturan çerçeve veya bu çerçeveye gezinmeyi başlatan çerçevedir. Bunun üst çerçeve olmayabileceğini unutmayın.
- 
    eşleşiyorstring[] isteğe bağlı Bu içerik komut dosyasının hangi sayfalara ekleneceğini belirtir. Bu dizelerin söz dizimi hakkında daha fazla bilgi için Eşleşme Kalıpları bölümüne bakın. registerContentScriptsiçin belirtilmelidir.
- 
    persistAcrossSessionsboolean isteğe bağlı Bu içerik komut dosyasının gelecekteki oturumlarda kalıcı olup olmayacağını belirtir. Varsayılan değer true'dur. 
- 
    runAtRunAt isteğe bağlı JavaScript dosyalarının web sayfasına ne zaman yerleştirileceğini belirtir. Tercih edilen ve varsayılan değer document_idle'dır.
- 
    dünyaExecutionWorld isteğe bağlı Chrome 102 veya daha yeni bir sürümKomut dosyasının çalıştırılacağı JavaScript "dünyası". Varsayılan olarak ISOLATEDdeğerine ayarlanır.
ScriptInjection
Özellikler
- 
    argsany[] isteğe bağlı Chrome 92 veya daha yeni bir sürümBelirtilen işleve geçirilecek bağımsız değişkenler. Bu yalnızca funcparametresi belirtilmişse geçerlidir. Bu bağımsız değişkenler JSON'a dönüştürülebilir olmalıdır.
- 
    dosyalarstring[] isteğe bağlı Eklenecek JS veya CSS dosyalarının yolu (uzantının kök dizinine göre). Tam olarak bir filesveyafuncbelirtilmelidir.
- 
    injectImmediatelyboolean isteğe bağlı Chrome 102 veya daha yeni bir sürümEkleme işleminin hedefte mümkün olduğunca kısa sürede tetiklenip tetiklenmeyeceği. Sayfa, komut dosyası hedefe ulaştığında zaten yüklenmiş olabileceğinden bunun, eklemenin sayfa yüklenmeden önce gerçekleşeceğini garanti etmediğini unutmayın. 
- 
    hedefKomut dosyasının ekleneceği hedefi belirten ayrıntılar. 
- 
    dünyaExecutionWorld isteğe bağlı Chrome 95 veya daha yeni bir sürümKomut dosyasının çalıştırılacağı JavaScript "dünyası". Varsayılan olarak ISOLATEDdeğerine ayarlanır.
- 
    funcvoid optional Chrome 92 veya daha yeni bir sürümEklenecek bir JavaScript işlevi. Bu işlev, ekleme için önce serileştirilir, ardından seri durumdan çıkarılır. Bu nedenle, tüm bağlı parametreler ve yürütme bağlamı kaybolur. Tam olarak bir filesveyafuncbelirtilmelidir.funcişlevi şu şekilde görünür:() => {...}
StyleOrigin
Stil değişikliğinin kaynağı. Daha fazla bilgi için stil kaynakları bölümüne bakın.
Enum
"AUTHOR" 
 
"USER" 
 
Yöntemler
executeScript()
chrome.scripting.executeScript(
injection: ScriptInjection,
): Promise<InjectionResult[]>
Hedef bağlama bir komut dosyası ekler. Varsayılan olarak komut dosyası document_idle tarihinde çalıştırılır veya sayfa zaten yüklenmişse hemen çalıştırılır. injectImmediately özelliği ayarlanırsa sayfa yüklenmeyi tamamlamamış olsa bile komut dosyası beklemeden yerleştirilir. Komut dosyası bir söz olarak değerlendirilirse tarayıcı, sözün yerine getirilmesini bekler ve sonuçta elde edilen değeri döndürür.
Parametreler
- 
    enjeksiyonEklenecek komut dosyasının ayrıntıları. 
İadeler
- 
            Promise<InjectionResult[]> Chrome 90 veya daha yeni bir sürüm
getRegisteredContentScripts()
chrome.scripting.getRegisteredContentScripts(
filter?: ContentScriptFilter,
): Promise<RegisteredContentScript[]>
Bu uzantı için, verilen filtreyle eşleşen tüm dinamik olarak kaydedilmiş içerik komut dosyalarını döndürür.
Parametreler
- 
    filtreleContentScriptFilter isteğe bağlı Uzantının dinamik olarak kaydedilen komut dosyalarını filtrelemek için kullanılan bir nesne. 
İadeler
- 
            Promise<RegisteredContentScript[]> 
insertCSS()
chrome.scripting.insertCSS(
injection: CSSInjection,
): Promise<void>
Hedef bağlama bir CSS stil sayfası ekler. Birden fazla çerçeve belirtilirse başarısız eklemeler yoksayılır.
Parametreler
- 
    enjeksiyonEklenecek stillerin ayrıntıları. 
İadeler
- 
            Promise<void> Chrome 90 veya daha yeni bir sürüm
registerContentScripts()
chrome.scripting.registerContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Bu uzantı için bir veya daha fazla içerik komut dosyası kaydeder.
Parametreler
- 
    komut dosyalarıKaydedilecek komut dosyalarının listesini içerir. Komut dosyası ayrıştırma/dosya doğrulama sırasında hatalar varsa veya belirtilen kimlikler zaten mevcutsa komut dosyaları kaydedilmez. 
İadeler
- 
            Promise<void> 
removeCSS()
chrome.scripting.removeCSS(
injection: CSSInjection,
): Promise<void>
Bu uzantı tarafından daha önce eklenmiş bir CSS stil sayfasını hedef bağlamdan kaldırır.
Parametreler
- 
    enjeksiyonKaldırılacak stillerin ayrıntıları. css,filesveoriginözelliklerinin,insertCSSaracılığıyla eklenen stil sayfasıyla tam olarak eşleşmesi gerektiğini unutmayın. Mevcut olmayan bir stil sayfasını kaldırmaya çalışmak etkisiz bir işlemdir.
İadeler
- 
            Promise<void> 
unregisterContentScripts()
chrome.scripting.unregisterContentScripts(
filter?: ContentScriptFilter,
): Promise<void>
Bu uzantının içerik komut dosyalarının kaydını siler.
Parametreler
- 
    filtreleContentScriptFilter isteğe bağlı Belirtilirse yalnızca filtreyle eşleşen dinamik içerik komut dosyalarının kaydı silinir. Aksi takdirde, uzantının tüm dinamik içerik komut dosyalarının kaydı silinir. 
İadeler
- 
            Promise<void> 
updateContentScripts()
chrome.scripting.updateContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Bu uzantı için bir veya daha fazla içerik komut dosyasını günceller.
Parametreler
- 
    komut dosyalarıGüncellenecek komut dosyalarının listesini içerir. Bir özellik yalnızca bu nesnede belirtilmişse mevcut komut dosyası için güncellenir. Komut dosyası ayrıştırma/dosya doğrulama sırasında hatalar varsa veya belirtilen kimlikler tam olarak kaydedilmiş bir komut dosyasına karşılık gelmiyorsa hiçbir komut dosyası güncellenmez. 
İadeler
- 
            Promise<void>