Kontrol pengguna untuk izin host: panduan transisi

Ringkasan

Apa yang berubah?

Mulai Chrome 70, pengguna dapat membatasi akses host ekstensi ke daftar situs kustom, atau mengonfigurasi ekstensi agar mewajibkan klik untuk mendapatkan akses ke halaman saat ini.

API mana yang terpengaruh?

Perubahan ini memengaruhi API apa pun yang terpengaruh oleh izin host yang ditentukan dalam manifes ekstensi Anda, serta skrip konten. API yang memerlukan izin host mencakup webRequest, cookie, tabs.executeScript(), dan tabs.insertCSS(), serta melakukan permintaan lintas asal, seperti melalui API XMLHTTPRequest atau fetch().

Membatasi akses

Bagaimana cara pengguna membatasi akses?

Pengguna dapat memilih untuk mengizinkan ekstensi Anda berjalan saat diklik, pada kumpulan situs tertentu, atau di semua situs yang diminta. Opsi ini ditampilkan kepada pengguna di halaman chrome://extensions serta di menu konteks ekstensi.

Screenshot kontrol menu konteks untuk izin host runtime,
            termasuk opsi untuk menjalankan ekstensi saat diklik, di situs tertentu, atau di semua situs.

Apa yang terjadi jika pengguna memilih untuk menjalankan ekstensi saya "saat diklik"?

Ekstensi pada dasarnya berperilaku seolah-olah menggunakan izin activeTab. Ekstensi diberikan akses sementara ke host mana pun yang digunakan pengguna untuk mengklik ekstensi, jika host tersebut diminta oleh ekstensi (dan bukan situs yang dibatasi, seperti chrome://settings). Jika ditetapkan untuk dijalankan saat diklik, Chrome akan memberi badge pada ekstensi Anda dengan lingkaran dan drop shadow (lihat di bawah) untuk menunjukkan bahwa ekstensi Anda meminta akses ke situs tertentu.

Screenshot badge Chrome yang ditambahkan ke ikon ekstensi di toolbar

Apa yang terjadi jika pengguna memilih untuk menjalankan ekstensi saya di situs tertentu?

Ekstensi Anda diizinkan untuk berjalan secara otomatis di situs mana pun yang dipilih pengguna, dan dapat mengakses situs tersebut tanpa tindakan pengguna lebih lanjut. Di situs lain yang diminta ekstensi Anda, tetapi pengguna tidak memberikan izin, perilakunya sama seperti jika pengguna telah menyetel ekstensi untuk dijalankan saat diklik.

Apa yang terjadi jika pengguna memilih untuk menjalankan ekstensi saya di semua situs?

Ekstensi dapat otomatis mengakses situs apa pun yang diminta dalam manifes.

Perilaku API

API permintaan web

Ekstensi tetap dapat mencegat, mengubah, dan memblokir permintaan apa pun dari situs yang aksesnya dimilikinya. Untuk situs yang tidak dapat diakses oleh ekstensi, Chrome memberikan badge ke ekstensi untuk menunjukkan bahwa ekstensi meminta akses ke halaman. Kemudian, pengguna dapat memberikan akses ke ekstensi tersebut; Chrome akan meminta pengguna memuat ulang halaman agar ekstensi Anda dapat menangkap permintaan jaringan.

Skrip konten, tab.executeScript(), tab.insertCSS()

Ekstensi masih dapat memasukkan skrip dan style sheet secara otomatis untuk situs apa pun yang aksesnya dimilikinya. Untuk situs yang tidak dapat diakses oleh ekstensi, Chrome memberikan badge ke ekstensi untuk menunjukkan bahwa ekstensi meminta akses ke halaman. Kemudian, pengguna dapat memberikan akses ke ekstensi. Jika skrip konten ditetapkan untuk dimasukkan di document_idle, skrip akan langsung dimasukkan. Jika tidak, Chrome akan meminta pengguna memuat ulang halaman agar ekstensi Anda dapat memasukkan skrip lebih awal saat pemuatan halaman (di document_start atau document_end). Callback untuk metode tabs.executeScript() dan tabs.insertCSS() hanya dipanggil jika pengguna memberikan akses ke situs.

Cookie dan halaman latar belakang XHR

Ekstensi masih dapat membaca dan mengubah cookie apa pun dari dan melakukan XHR lintas origin ke situs yang aksesnya dimilikinya. Karena tidak ada tab yang terkait dengan halaman ekstensi yang mengakses cookie origin lain atau XHRing ke host lain, Chrome tidak memberikan badge pada ekstensi untuk menunjukkan kepada pengguna bahwa ekstensi meminta akses untuk mengakses situs. Mencoba mengakses cookie untuk situs lain atau membuat XHR lintas origin akan gagal dengan error seolah-olah manifes ekstensi tidak menyertakan izin host. Untuk kasus ini, sebaiknya gunakan izin opsional agar pengguna dapat memberikan akses runtime ke situs yang berbeda.

Contoh di bawah menggambarkan cara kerjanya untuk API cookie.

Sebelum:

{
  ...
  "permissions": ["cookies", "https://example.com"]
}
chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                    function(cookie) {
                      // Use the cookie.
                    });

Sesudah:

{
  ...
  "permissions": ["cookies"],
  "optional_permissions": ["https://example.com"]
}
// Note: permissions.request() requires a user gesture, so this
// may only be done in response to a user action.
chrome.permissions.request(
    {origins: ['https://example.com']},
    function(granted) {
      if (granted) {
        chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                            function(cookie) {
                              // Use the cookie.
                            });
      } else {
        // Handle grant failure
      }
    });

Migrasi

Apa praktik terbaik untuk menghindari dampak negatif?

Ekstensi dapat menggunakan API izin opsional, activeTab, dan declarativeContent untuk mengikuti praktik terbaik. Izin opsional diberikan saat runtime, dan memungkinkan ekstensi untuk meminta akses tertentu ke situs. Izin activeTab tidak terpengaruh, dan ekstensi yang menggunakannya akan terus berfungsi seperti biasa. API declarativeContent adalah pengganti banyak kebutuhan untuk memasukkan skrip ke setiap halaman.

Apa yang terjadi pada setelan pengguna saya saat ini?

Perubahan ini tidak akan langsung memengaruhi izin yang saat ini diberikan ke ekstensi Anda. Artinya, aplikasi akan terus beroperasi seperti sebelumnya kecuali pengguna mengambil tindakan untuk membatasi situs yang boleh diaksesnya. Dalam rilis mendatang, Chrome akan memberikan lebih banyak kontrol kepada pengguna untuk menyesuaikan setelan.

Bagaimana cara memeriksa apakah ekstensi saya memiliki izin untuk berjalan di situs?

Anda dapat menggunakan API permissions.contains() untuk memeriksa apakah ekstensi Anda telah diberi akses ke origin tertentu.