Açıklama
Farklı bağlamlarda komut dosyası yürütmek için chrome.scripting
API'yi kullanın.
İzinler
scripting
Kullanı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
-
ids
string[] isteğe bağlı
Belirtilirse
getRegisteredContentScripts
yalnızca bu listede kimliği belirtilen komut dosyalarını döndürür.
CSSInjection
Özellikler
-
css
dize isteğe bağlı
Eklenecek CSS'yi içeren bir dize. Tam olarak bir
files
vecss
belirtilmelidir. -
dosyalar
string[] isteğe bağlı
Eklenecek CSS dosyalarının yolu (uzantının kök dizinine göre). Tam olarak bir
files
vecss
belirtilmelidir. -
kaynak
StyleOrigin isteğe bağlı
Ekleme için stil kaynağı. Varsayılan olarak
'AUTHOR'
değerine ayarlanır. -
hedef
CSS'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
-
documentId
dize
Chrome 106 ve sonraki sürümlerEkleme işlemiyle ilişkili doküman.
-
frameId
sayı
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
-
allFrames
boolean isteğe bağlı
Komut dosyasının sekmedeki tüm çerçevelere eklenip eklenmeyeceği. Varsayılan olarak false değerine ayarlanır.
frameIds
belirtilmişse bu doğru olmamalıdır. -
documentIds
string[] isteğe bağlı
Chrome 106 ve sonraki sürümlerİçine yerleştirilecek belirli documentId'lerin kimlikleri.
frameIds
ayarlandıysa bu ayarlanmamalıdır. -
frameIds
number[] isteğe bağlı
Enjekte edilecek belirli çerçevelerin kimlikleri.
-
tabId
sayı
Eklenecek sekmenin kimliği.
RegisteredContentScript
Özellikler
-
allFrames
boolean 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.
-
css
string[] 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.
-
excludeMatches
string[] 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.
-
id
dize
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.
-
js
string[] 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.
-
matchOriginAsFallback
boolean 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
null
ise (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şiyor
string[] 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.
registerContentScripts
için belirtilmelidir. -
persistAcrossSessions
boolean 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.
-
runAt
RunAt 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ünya
ExecutionWorld 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
ISOLATED
değerine ayarlanır.
ScriptInjection
Özellikler
-
args
any[] 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
func
parametresi belirtilmişse geçerlidir. Bu bağımsız değişkenler JSON'a dönüştürülebilir olmalıdır. -
dosyalar
string[] isteğe bağlı
Eklenecek JS veya CSS dosyalarının yolu (uzantının kök dizinine göre). Tam olarak bir
files
veyafunc
belirtilmelidir. -
injectImmediately
boolean 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.
-
hedef
Komut dosyasının ekleneceği hedefi belirten ayrıntılar.
-
dünya
ExecutionWorld 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
ISOLATED
değerine ayarlanır. -
func
void 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
files
veyafunc
belirtilmelidir.func
iş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
-
enjeksiyon
Eklenecek 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
-
filtrele
ContentScriptFilter 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
-
enjeksiyon
Eklenecek 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
-
enjeksiyon
Kaldırılacak stillerin ayrıntıları.
css
,files
veorigin
özelliklerinin,insertCSS
aracı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
-
filtrele
ContentScriptFilter 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>