Menyesuaikan ekstensi untuk Googlebook OS

Googlebook OS adalah sistem operasi untuk perangkat Googlebook, yang dibangun di atas technology stack Android dan dipasangkan dengan fondasi desktop dari ChromeOS. Googlebook mendukung platform WebExtensions yang sama dengan yang ada di Windows, macOS, dan ChromeOS, tetapi ada beberapa perbedaan dalam cara menjalankannya di sana.

  • Deteksi platform jarang diperlukan, tetapi pemeriksaan yang ada dapat gagal karena API ekstensi melaporkan android, sedangkan agen pengguna melaporkan ChromeOS.
  • Pesan native belum tersedia, tetapi sedang dikerjakan. Harapkan pesan dirutekan ke aplikasi Android yang terinstal, bukan dapat dieksekusi desktop.
  • Pintasan keyboard menggunakan pengikatan tombol Linux, bukan entri chromeos.
  • SharedArrayBuffer mengharuskan Anda ikut serta dalam isolasi lintas asal, dan harus berjalan di halaman ekstensi atau dokumen offscreen, bukan service worker.
  • API khusus ChromeOS tidak didukung di Googlebook OS, meskipun agen pengguna melaporkan Chrome OS. Ekstensi yang mendeklarasikan izin ini tetap diinstal, tetapi namespace API adalah undefined saat runtime.
  • browser.system.storage tidak didukung di Googlebook OS, sehingga namespace API adalah undefined saat runtime.

Deteksi platform

Sebagian besar ekstensi tidak perlu mendeteksi Googlebook OS. Ikuti praktik terbaik pengembangan web standar, seperti deteksi fitur dan desain responsif, daripada memeriksa sistem operasi yang digunakan browser.

Jika ekstensi Anda sudah memeriksa sistem operasi, API ekstensi dan agen pengguna akan menampilkan platform yang berbeda di Googlebook OS.

  • chrome.runtime.getPlatformInfo().os akan menampilkan 'android'. Jika ekstensi Anda berbagi kode dengan browser seluler dan mengasumsikan 'android' berarti ponsel, pengguna Googlebook akan mendapatkan UI seluler Anda di laptop.
  • navigator.userAgent berisi CrOS. Untuk tata letak halaman umum, pencocokan Chromebook berfungsi dengan baik. Namun, navigator.userAgentData.platform menampilkan 'Android', dan jika ekstensi Anda memeriksa agen pengguna untuk menampilkan petunjuk pintasan keyboard ChromeOS (seperti tombol Search) atau untuk memanggil API khusus ChromeOS, pemeriksaan tersebut akan salah di Googlebook.

Tabel berikut membandingkan sinyal ini di seluruh platform.

Sinyal Googlebook OS Ponsel Android Chromebook Windows, macOS, Linux
runtime.getPlatformInfo().os android android cros mac, win, linux
navigator.userAgentData.platform Android Android Chrome OS Windows, macOS, Linux
navigator.userAgentData.mobile false true false false

Sebaliknya, navigator.userAgent menampilkan string agen pengguna yang dikurangi yang identik di Googlebook OS dan ChromeOS, karena kedua platform melaporkan token platform X11; CrOS x86_64 14541.0.0 yang dibekukan.

// Googlebook OS
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36
// ChromeOS
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36

Seperti halnya semua pengembangan web, deteksi platform bisa tidak dapat diandalkan, jadi gunakan hanya jika Anda tidak dapat menggunakan deteksi fitur untuk menguji secara langsung apa yang Anda butuhkan. Jika Anda perlu membedakan Googlebook OS dari ponsel Android dan Chromebook, hal ini dapat dilakukan dengan menggabungkan runtime.getPlatformInfo() dengan petunjuk mobile dari Petunjuk Klien User-Agent.

async function getPlatform() {
  const { os, arch } = await chrome.runtime.getPlatformInfo();
  // userAgentData is undefined in browsers that don't implement User-Agent
  // Client Hints, so read mobile defensively.
  const mobile = navigator.userAgentData?.mobile;
  return {
    os,
    arch,
    isGooglebook: os === 'android' && mobile === false,
    isPhone: os === 'android' && mobile !== false
  };
}

Meskipun kombinasi perbandingan string ini secara unik mengarah ke perangkat Googlebook OS pada saat peluncuran produk, hal itu mungkin tidak selalu terjadi. Seiring waktu, saat lebih banyak perangkat mulai dikirimkan dalam berbagai faktor bentuk, mungkin akan tiba saatnya beberapa perangkat Googlebook OS tidak cocok dengan deteksi tersebut.

Untuk mendeteksi Googlebook dari halaman web atau di server menggunakan petunjuk klien, lihat Mengidentifikasi Googlebook.

Pesan native

Pesan native belum tersedia di Googlebook OS, tetapi sedang diupayakan. Harapkan ekstensi ini berkomunikasi dengan aplikasi Android yang diinstal, bukan file yang dapat dieksekusi desktop lokal. Untuk saat ini, ekstensi yang mendeklarasikan izin nativeMessaging tetap diinstal dan berjalan di Googlebook OS, tetapi upaya koneksi gagal. Pastikan ekstensi Anda menangani kegagalan koneksi dengan baik dan kembali ke alur kerja berbasis web saat host native tidak tersedia. Ikuti masalah 555299632 untuk mendapatkan info terbaru.

Pintasan keyboard

Pintasan commands mengikuti aturan yang sama dengan Chrome di Linux. Chrome membaca entri linux dari suggested_key di Googlebook OS, sehingga pintasan yang ditentukan di bagian chromeos tidak berlaku. Kombinasi tombol Search juga tidak berfungsi karena tidak ada tombol "Penelusuran" di perangkat Googlebook OS.

SharedArrayBuffer

Di Windows, macOS, Linux, dan ChromeOS, ekstensi dapat menggunakan SharedArrayBuffer secara otomatis dalam konteks apa pun. Di Googlebook OS, ekstensi harus secara eksplisit memilih untuk menggunakan isolasi lintas asal di manifest.json untuk menggunakan SharedArrayBuffer.

Memilih untuk menggunakan isolasi lintas asal akan mengaktifkan SharedArrayBuffer di dokumen ekstensi seperti pop-up, halaman opsi, dan dokumen di luar layar. Namun, fitur ini tidak mengaktifkan SharedArrayBuffer di pekerja layanan ekstensi, karena Chrome belum mendukung isolasi lintas origin untuk pekerja layanan (masalah 40150182). Jika logika latar belakang Anda bergantung pada SharedArrayBuffer (misalnya, untuk menjalankan WebAssembly ber-thread), jalankan kode tersebut di dokumen di balik layar, bukan di service worker Anda.

API khusus ChromeOS

API yang ditandai Khusus ChromeOS dalam referensi API Ekstensi Chrome (seperti documentScan, fileSystemProvider, vpnProvider, dan printing) tidak didukung di Googlebook OS, meskipun navigator.userAgent mencakup CrOS. Ekstensi yang mendeklarasikan izin ini tetap diinstal dan berjalan, tetapi namespace API adalah undefined saat runtime. Periksa apakah namespace API ada sebelum memanggilnya, bukan mengandalkan deteksi agen pengguna.

browser.system.storage

API browser.system.storage tidak didukung di Googlebook OS. Ekstensi yang mendeklarasikan izin system.storage di manifest.json masih diinstal dan dijalankan, tetapi namespace-nya adalah undefined saat runtime. Periksa apakah API ditentukan sebelum memanggil getInfo(), ejectDevice(), atau mendaftarkan pemroses penyimpanan.