chrome.userScripts

Deskripsi

Gunakan userScripts API untuk mengeksekusi skrip pengguna dalam konteks Skrip Pengguna.

Izin

userScripts

Untuk menggunakan chrome.userScripts API, tambahkan izin "userScripts" ke manifest.json dan "host_permissions" untuk situs tempat Anda ingin menjalankan skrip.

{
  "name": "User script test extension",
  "manifest_version": 3,
  "minimum_chrome_version": "120",
  "permissions": [
    "userScripts"
  ],
  "host_permissions": [
    "*://example.com/*"
  ]
}

Ketersediaan

Chrome 120 dan yang lebih baru MV3 dan yang lebih baru

Konsep dan penggunaan

Skrip pengguna adalah sedikit kode yang dimasukkan ke dalam halaman web untuk mengubah tampilan atau perilakunya. Skrip dibuat oleh pengguna atau didownload dari repositori skrip atau ekstensi skrip pengguna.

Mode developer untuk pengguna ekstensi

Sebagai developer ekstensi, Anda telah mengaktifkan Mode developer di penginstalan Chrome. Untuk ekstensi skrip pengguna, pengguna Anda juga harus mengaktifkan mode developer. Berikut adalah petunjuk yang dapat Anda salin dan tempel ke dalam dokumentasi Anda sendiri.

  1. Buka halaman Ekstensi dengan memasukkan chrome://extensions di tab baru. (Menurut desainnya, chrome:// URL tidak dapat ditautkan.)
  2. Aktifkan Mode Developer dengan mengklik tombol di samping Mode developer.

    Halaman ekstensi

    Halaman ekstensi (chrome://extensions)

Anda dapat menentukan apakah mode developer diaktifkan dengan memeriksa apakah chrome.userScripts menampilkan error. Contoh:

function isUserScriptsAvailable() {
  try {
    // Property access which throws if developer mode is not enabled.
    chrome.userScripts;
    return true;
  } catch {
    // Not available.
    return false;
  }
}

Bekerja di dunia terisolasi

Skrip pengguna dan konten dapat berjalan di platform yang terisolasi atau di dunia utama. Dunia yang terisolasi adalah lingkungan eksekusi yang tidak dapat diakses oleh halaman host atau ekstensi lain. Hal ini memungkinkan skrip pengguna mengubah lingkungan JavaScript-nya tanpa memengaruhi halaman host atau ekstensi lainnya pengguna dan skrip konten. Sebaliknya, skrip pengguna (dan skrip konten) tidak terlihat oleh halaman host atau skrip pengguna dan konten dari ekstensi lain. Skrip yang berjalan di platform utama dapat diakses oleh halaman host dan ekstensi lain serta dapat dilihat oleh halaman host dan ekstensi lain. Untuk memilih dunia, teruskan "USER_SCRIPT" atau "MAIN" saat memanggil userScripts.register().

Untuk mengonfigurasi kebijakan keamanan konten untuk dunia USER_SCRIPT, panggil userScripts.configureWorld():

chrome.userScripts.configureWorld({
  csp: "script-src 'self'"
});

Messaging

Seperti skrip konten dan dokumen di luar layar, skrip pengguna berkomunikasi dengan bagian lain dari ekstensi menggunakan pesan (artinya mereka dapat memanggil runtime.sendMessage() dan runtime.connect() seperti bagian lain dari ekstensi). Namun, peristiwa tersebut diterima menggunakan pengendali peristiwa khusus (artinya, objek tersebut tidak menggunakan onMessage atau onConnect). Pengendali ini disebut runtime.onUserScriptMessage dan runtime.onUserScriptConnect. Pengendali khusus memudahkan identifikasi pesan dari skrip pengguna, yang merupakan konteks yang kurang tepercaya.

Sebelum mengirim pesan, Anda harus memanggil configureWorld() dengan argumen messaging yang disetel ke true. Perhatikan bahwa argumen csp dan messaging dapat diteruskan secara bersamaan.

chrome.userScripts.configureWorld({
  messaging: true
});

Update ekstensi

Skrip pengguna dihapus saat ekstensi diupdate. Anda dapat menambahkannya kembali dengan menjalankan kode di pengendali peristiwa runtime.onInstalled di pekerja layanan ekstensi. Hanya respons alasan "update" yang diteruskan ke callback peristiwa.

Contoh

Contoh ini berasal dari contoh userScript di repositori contoh kami.

Mendaftarkan skrip

Contoh berikut menunjukkan panggilan dasar ke register(). Argumen pertama adalah array objek yang menentukan skrip yang akan didaftarkan. Ada lebih banyak opsi daripada yang ditampilkan di sini.

chrome.userScripts.register([{
  id: 'test',
  matches: ['*://*/*'],
  js: [{code: 'alert("Hi!")'}]
}]);

Jenis

ExecutionWorld

Dunia JavaScript untuk skrip pengguna yang akan dieksekusi.

Enum

"MAIN"
Menentukan lingkungan eksekusi DOM, yaitu lingkungan eksekusi yang digunakan bersama dengan JavaScript halaman host.

"USER_SCRIPT"
Menentukan lingkungan eksekusi yang spesifik untuk skrip pengguna dan dikecualikan dari CSP halaman.

RegisteredUserScript

Properti

  • allFrames

    boolean opsional

    Jika true (benar), kode ini akan dimasukkan ke semua frame, meskipun frame tersebut bukan frame paling atas dalam tab. Setiap frame diperiksa secara terpisah untuk mengetahui persyaratan URL; itu tidak akan dimasukkan ke dalam {i>frame<i} turunan jika persyaratan URL tidak terpenuhi. Default-nya adalah false, artinya hanya frame teratas yang cocok.

  • excludeGlobs

    string[] opsional

    Menentukan pola karakter pengganti untuk halaman yang TIDAK akan dimasukkan skrip pengguna ini.

  • excludeMatches

    string[] opsional

    Mengecualikan halaman yang seharusnya dimasukkan skrip pengguna ini. Lihat Pola Pencocokan untuk mengetahui detail selengkapnya tentang sintaksis string ini.

  • id

    string

    ID skrip pengguna yang ditentukan dalam panggilan API. Properti ini tidak boleh diawali dengan '_' karena dicadangkan sebagai awalan untuk ID skrip yang dihasilkan.

  • includeGlobs

    string[] opsional

    Menentukan pola karakter pengganti untuk halaman tempat skrip pengguna ini akan dimasukkan.

  • Daftar objek ScriptSource yang menentukan sumber skrip yang akan dimasukkan ke halaman yang cocok.

  • cocok

    string[] opsional

    Menentukan halaman tempat skrip pengguna ini akan dimasukkan. Lihat Pola Pencocokan untuk mengetahui detail selengkapnya tentang sintaksis string ini. Properti ini harus ditentukan untuk ${ref:register}.

  • runAt

    RunAt opsional

    Menentukan kapan file JavaScript dimasukkan ke halaman web. Nilai yang disukai dan default adalah document_idle.

  • dunia

    ExecutionWorld opsional

    Lingkungan eksekusi JavaScript tempat skrip akan dijalankan. Defaultnya adalah `USER_SCRIPT`.

ScriptSource

Properti

  • kode

    string opsional

    String yang berisi kode JavaScript yang akan dimasukkan. Hanya satu dari file atau code yang harus ditentukan.

  • file

    string opsional

    Jalur file JavaScript yang akan dimasukkan relatif ke direktori root ekstensi. Hanya satu dari file atau code yang harus ditentukan.

UserScriptFilter

Properti

  • ids

    string[] opsional

    getScripts hanya menampilkan skrip dengan ID yang ditentukan dalam daftar ini.

WorldProperties

Properti

  • CSP

    string opsional

    Menentukan csp dunia. Defaultnya adalah csp dunia `ISOLATED`.

  • pesan

    boolean opsional

    Menentukan apakah API pesan terekspos. Defaultnya adalah false.

Metode

configureWorld()

Janji
chrome.userScripts.configureWorld(
  properties: WorldProperties,
  callback?: function,
)

Mengonfigurasi lingkungan eksekusi `USER_SCRIPT`.

Parameter

  • properti

    Berisi konfigurasi dunia skrip pengguna.

  • callback

    fungsi opsional

    Parameter callback terlihat seperti ini:

    () => void

Hasil

  • Janji<void>

    Promise didukung di Manifes V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Tujuan promise yang di-resolve dengan jenis yang sama dengan yang diteruskan ke callback.

getScripts()

Janji
chrome.userScripts.getScripts(
  filter?: UserScriptFilter,
  callback?: function,
)

Menampilkan semua skrip pengguna yang terdaftar secara dinamis untuk ekstensi ini.

Parameter

Hasil

  • Promise&lt;RegisteredUserScript[]&gt;

    Promise didukung di Manifes V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Tujuan promise yang di-resolve dengan jenis yang sama dengan yang diteruskan ke callback.

register()

Janji
chrome.userScripts.register(
  scripts: RegisteredUserScript[],
  callback?: function,
)

Mendaftarkan satu atau beberapa skrip pengguna untuk ekstensi ini.

Parameter

  • Berisi daftar skrip pengguna yang akan didaftarkan.

  • callback

    fungsi opsional

    Parameter callback terlihat seperti ini:

    () => void

Hasil

  • Janji<void>

    Promise didukung di Manifes V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Tujuan promise yang di-resolve dengan jenis yang sama dengan yang diteruskan ke callback.

unregister()

Janji
chrome.userScripts.unregister(
  filter?: UserScriptFilter,
  callback?: function,
)

Membatalkan pendaftaran semua skrip pengguna yang terdaftar secara dinamis untuk ekstensi ini.

Parameter

  • filter

    Jika ditentukan, metode ini hanya akan membatalkan pendaftaran skrip pengguna yang cocok.

  • callback

    fungsi opsional

    Parameter callback terlihat seperti ini:

    () => void

Hasil

  • Janji<void>

    Promise didukung di Manifes V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Tujuan promise yang di-resolve dengan jenis yang sama dengan yang diteruskan ke callback.

update()

Janji
chrome.userScripts.update(
  scripts: RegisteredUserScript[],
  callback?: function,
)

Memperbarui satu atau beberapa skrip pengguna untuk ekstensi ini.

Parameter

  • Berisi daftar skrip pengguna yang akan diperbarui. Properti hanya diperbarui untuk skrip yang ada jika ditentukan dalam objek ini. Jika ada error selama penguraian skrip/validasi file, atau jika ID yang ditentukan tidak sesuai dengan skrip yang terdaftar sepenuhnya, tidak ada skrip yang diperbarui.

  • callback

    fungsi opsional

    Parameter callback terlihat seperti ini:

    () => void

Hasil

  • Janji<void>

    Promise didukung di Manifes V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Tujuan promise yang di-resolve dengan jenis yang sama dengan yang diteruskan ke callback.