Kontrol pengguna untuk izin host: panduan transisi

Ringkasan

Apa yang berubah?

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

API mana yang terpengaruh?

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

Membatasi akses

Bagaimana cara pengguna membatasi akses?

Pengguna dapat memilih untuk mengizinkan ekstensi Anda dijalankan saat diklik, di kumpulan situs tertentu, atau di semua situs 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. Ekstensinya adalah memberikan akses sementara ke host mana pun yang ekstensinya diklik pengguna, jika host tersebut diminta oleh ekstensi (dan bukan situs yang dibatasi, seperti chrome://settings). Ketika diatur untuk berjalan saat diklik, Chrome memberikan badge pada ekstensi Anda dengan lingkaran dan drop shadow (lihat di bawah) untuk menunjukkan yang meminta akses pada situs tertentu.

Screenshot badge yang ditambahkan Chrome ke ikon ekstensi di toolbar

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

Ekstensi Anda diizinkan berjalan secara otomatis di situs mana pun yang dipilih pengguna, dan dapat mengakses tanpa ada tindakan lebih lanjut dari pengguna. Di situs lain yang diminta ekstensi Anda, tetapi pengguna tidak memintanya memberi 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 masih dapat mencegat, mengubah, dan memblokir permintaan apa pun dari situs yang aksesnya dimiliki. Sebagai situs yang tidak dapat diakses oleh ekstensi, Chrome memberikan badge ekstensi untuk menunjukkan bahwa ekstensi meminta akses ke halaman. Kemudian, pengguna dapat memberikan akses ke ekstensi; Chrome kemudian meminta pengguna memuat ulang halaman agar ekstensi Anda dapat menangkap permintaan jaringan.

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

Ekstensi masih dapat memasukkan skrip dan lembar gaya secara otomatis untuk situs mana pun yang aksesnya dimiliki tempat mesin terhubung. Untuk situs yang tidak dapat diakses oleh ekstensi, Chrome memberikan badge ekstensi untuk menunjukkan bahwa ekstensi akan meminta akses ke halaman. Kemudian, pengguna dapat memberikan akses ke ekstensi. Jika skrip konten diatur untuk diinjeksikan di document_idle, skrip akan segera dimasukkan. Jika tidak, Chrome meminta pengguna memuat ulang halaman untuk mengizinkan ekstensi Anda memasukkan skrip lebih awal pemuatan halaman (di document_start atau document_end). Callback untuk tabs.executeScript() dan Metode tabs.insertCSS() hanya dipanggil jika pengguna memberikan akses ke situs.

Cookie dan XHR halaman latar belakang

Ekstensi masih dapat membaca dan mengubah cookie dari dan melakukan XHR lintas asal ke situs yang dapat diakses. Karena tidak ada tab yang terkait dengan halaman ekstensi yang mengakses asal lain cookie atau XHRing ke host lain, Chrome tidak memberi badge ekstensi untuk menunjukkan kepada pengguna ekstensi meminta untuk mengakses situs. Mencoba mengakses cookie untuk situs lain atau membuat XHR lintas origin akan gagal dengan error seolah-olah manifes ekstensi tidak menyertakan host izin akses. Untuk kasus ini, kami mendorong Anda untuk menggunakan izin opsional untuk memungkinkan pengguna untuk memberikan akses runtime ke situs yang berbeda.

Contoh di bawah mengilustrasikan 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 spesifik ke sebuah situs. Izin activeTab tidak terpengaruh, dan ekstensi menggunakannya tetap berfungsi seperti biasa. declarativeContent API adalah pengganti banyak kebutuhan untuk memasukkan skrip ke setiap halaman.

Apa yang terjadi dengan pengguna saya saat ini? setelan?

Perubahan ini tidak akan langsung memengaruhi izin saat ini yang diberikan ke ekstensi Anda. Yaitu, layanan akan terus beroperasi seperti sebelumnya, kecuali jika pengguna mengambil tindakan untuk membatasi situs yang yang diizinkan untuk diakses. 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 yang telah diberi akses ke suatu asal tertentu.