ปรับส่วนขยายสำหรับระบบปฏิบัติการ Googlebook

Googlebook OS คือระบบปฏิบัติการสำหรับอุปกรณ์ Googlebook ซึ่งสร้างขึ้นบน Technology Stack ของ Android และจับคู่กับพื้นฐานของเดสก์ท็อปจาก ChromeOS Googlebooks รองรับแพลตฟอร์ม WebExtensions เดียวกันกับที่มีใน Windows, macOS และ ChromeOS แต่มีข้อแตกต่างบางอย่างเกี่ยวกับวิธีที่ส่วนขยายทำงานในแพลตฟอร์มเหล่านั้น

  • การตรวจหาแพลตฟอร์มไม่ค่อยจำเป็น แต่การตรวจสอบที่มีอยู่อาจ ทำงานผิดพลาดเนื่องจาก API ของส่วนขยายรายงาน android ขณะที่ User Agent รายงาน ChromeOS
  • การรับส่งข้อความดั้งเดิมยังไม่พร้อมใช้งาน แต่เรากำลัง ดำเนินการอยู่ คาดว่าระบบจะกำหนดเส้นทางข้อความไปยังแอป Android ที่ติดตั้งไว้แทนที่จะเป็นไฟล์ที่เรียกใช้งานได้บนเดสก์ท็อป
  • แป้นพิมพ์ลัดใช้การเชื่อมโยงคีย์ของ Linux แทนรายการchromeos
  • SharedArrayBuffer ต้องเลือกใช้การแยกแบบข้ามต้นทาง และต้องทํางานในหน้าส่วนขยายหรือเอกสารนอกหน้าจอ แทนที่จะเป็น Service Worker
  • API สำหรับ ChromeOS เท่านั้นไม่รองรับใน Googlebook OS แม้ว่า User Agent จะรายงาน Chrome OS ก็ตาม ส่วนขยายที่ประกาศสิทธิ์เหล่านี้จะยังคงติดตั้งได้ แต่เนมสเปซของ API จะเป็น undefined ใน รันไทม์
  • browser.system.storage ไม่รองรับใน Googlebook OS ดังนั้นเนมสเปซของ API จึงเป็น undefined ในขณะรันไทม์

การตรวจหาแพลตฟอร์ม

ส่วนขยายส่วนใหญ่ไม่จำเป็นต้องตรวจหา Googlebook OS ทำตามแนวทางปฏิบัติแนะนำในการพัฒนาเว็บมาตรฐาน เช่น การตรวจหาฟีเจอร์และการออกแบบที่ปรับเปลี่ยนตามบริบท แทนที่จะตรวจสอบว่าเบราว์เซอร์ทำงานบนระบบปฏิบัติการใด

หากส่วนขยายตรวจสอบระบบปฏิบัติการอยู่แล้ว API ของส่วนขยายและ User Agent จะแสดงแพลตฟอร์มที่แตกต่างกันในระบบปฏิบัติการ Googlebook

  • chrome.runtime.getPlatformInfo().os คืนค่า 'android' หากส่วนขยายแชร์โค้ดกับเบราว์เซอร์บนอุปกรณ์เคลื่อนที่และถือว่า 'android' หมายถึงโทรศัพท์ ผู้ใช้ Googlebook จะเห็น UI สำหรับอุปกรณ์เคลื่อนที่บนแล็ปท็อป
  • navigator.userAgent มี CrOS สำหรับการจัดวางหน้าเว็บทั่วไป การใช้ Chromebook จะได้ผลดี อย่างไรก็ตาม navigator.userAgentData.platformจะส่งคืน 'Android' และหากส่วนขยายตรวจสอบ User Agent เพื่อแสดงคำแนะนำแป้นพิมพ์ลัดของ ChromeOS (เช่น แป้น Search) หรือเพื่อเรียกใช้ API ของ ChromeOS เท่านั้น การตรวจสอบเหล่านั้นจะทำงานผิดพลาดใน Googlebook

ตารางต่อไปนี้เปรียบเทียบสัญญาณเหล่านี้ในแพลตฟอร์มต่างๆ

สัญญาณ Googlebook OS โทรศัพท์ 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

ในทางตรงกันข้าม navigator.userAgent จะแสดงสตริง User-Agent ที่ลดขนาดแล้วที่เหมือนกันทั้งในระบบปฏิบัติการ Googlebook OS และ ChromeOS เนื่องจากทั้ง 2 แพลตฟอร์มรายงานโทเค็นแพลตฟอร์ม X11; CrOS x86_64 14541.0.0 ที่หยุดการเปลี่ยนแปลง

// 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

การตรวจหาแพลตฟอร์มอาจไม่น่าเชื่อถือเช่นเดียวกับการพัฒนาเว็บทั้งหมด ดังนั้นให้ใช้ เฉพาะในกรณีที่คุณไม่สามารถใช้การตรวจหาฟีเจอร์เพื่อทดสอบสิ่งที่ต้องการได้โดยตรง หากจำเป็นต้องแยกความแตกต่างระหว่าง Googlebook OS กับทั้งโทรศัพท์ Android และ Chromebook คุณสามารถทำได้โดยการรวม runtime.getPlatformInfo() เข้ากับคำใบ้ mobile จากคำแนะนำสำหรับไคลเอ็นต์ 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
  };
}

แม้ว่าการเปรียบเทียบสตริงแบบเฉพาะเจาะจงนี้จะชี้ไปยังอุปกรณ์ Googlebook OS อย่างชัดเจนในขณะที่เปิดตัวผลิตภัณฑ์ แต่ก็อาจไม่เป็นเช่นนั้นเสมอไป เมื่อเวลาผ่านไปและมีการจัดส่งอุปกรณ์มากขึ้นในรูปแบบต่างๆ อาจมีบางครั้งที่อุปกรณ์ Googlebook OS บางเครื่องไม่ตรงกับการตรวจหาดังกล่าว

หากต้องการตรวจหา Googlebook จากหน้าเว็บหรือในเซิร์ฟเวอร์โดยใช้คำแนะนำไคลเอ็นต์ โปรดดูหัวข้อระบุ Googlebook

การรับส่งข้อความในเครื่อง

การรับส่งข้อความดั้งเดิมยังไม่พร้อมใช้งานในระบบปฏิบัติการ Googlebook OS แต่เรากำลังดำเนินการอยู่ คาดว่าจะมีส่วนขยายที่สื่อสารกับแอป Android ที่ติดตั้งไว้แทนที่จะเป็นไฟล์ปฏิบัติการในเดสก์ท็อปในเครื่อง ในตอนนี้ ส่วนขยายที่ประกาศสิทธิ์ nativeMessaging ยังคงติดตั้งและทำงานใน Googlebook OS ได้ แต่การพยายามเชื่อมต่อจะล้มเหลว ตรวจสอบว่าส่วนขยายของคุณจัดการข้อผิดพลาดในการเชื่อมต่อได้อย่างราบรื่นและกลับไปใช้เวิร์กโฟลว์บนเว็บเมื่อโฮสต์เนทีฟไม่พร้อมใช้งาน โปรดติดตามข้อมูลอัปเดตเกี่ยวกับปัญหา 555299632

แป้นพิมพ์ลัด

แป้นพิมพ์ลัด commands จะใช้กฎเดียวกันกับ Chrome ใน Linux Chrome จะอ่านรายการ linux ของ suggested_key ใน Googlebook OS ดังนั้นแป้นพิมพ์ลัดที่กำหนดไว้ใน chromeos จะไม่มีผล Search ก็ใช้ไม่ได้เช่นกัน เนื่องจากไม่มีปุ่ม "ค้นหา" ในอุปกรณ์ Googlebook OS

SharedArrayBuffer

ใน Windows, macOS, Linux และ ChromeOS ส่วนขยายจะใช้ SharedArrayBuffer ได้โดยอัตโนมัติในทุกบริบท ใน Googlebook OS ส่วนขยายต้องเลือกใช้การแยกแบบข้ามต้นทางอย่างชัดเจนในmanifest.json เพื่อใช้ SharedArrayBuffer

การเลือกใช้การแยกแบบข้ามต้นทางจะเปิดใช้ SharedArrayBuffer ในเอกสารส่วนขยาย เช่น ป๊อปอัป หน้าตัวเลือก และเอกสารนอกหน้าจอ อย่างไรก็ตาม ฟีเจอร์นี้ไม่ได้เปิดใช้ SharedArrayBuffer ใน Service Worker ของส่วนขยาย เนื่องจาก Chrome ยังไม่รองรับ การแยกต้นทางข้ามสำหรับ Service Worker (ปัญหา 40150182) หากตรรกะเบื้องหลังของคุณอาศัย SharedArrayBuffer (เช่น เพื่อเรียกใช้ WebAssembly แบบหลายเธรด) ให้เรียกใช้โค้ดนั้นใน เอกสารนอกหน้าจอแทนที่จะใช้ Service Worker

API สำหรับ ChromeOS เท่านั้น

API ที่ทำเครื่องหมายว่าChromeOS เท่านั้นในเอกสารอ้างอิง Chrome Extensions API (เช่น documentScan, fileSystemProvider, vpnProvider และ printing) จะไม่รองรับใน Googlebook OS แม้ว่า navigator.userAgent จะมี CrOS ก็ตาม ส่วนขยายที่ประกาศสิทธิ์เหล่านี้ จะยังคงติดตั้งและทำงานได้ แต่เนมสเปซของ API จะundefinedในรันไทม์ ตรวจสอบว่ามีเนมสเปซ API อยู่ก่อนที่จะเรียกใช้แทนที่จะอาศัยการตรวจหา User-Agent

browser.system.storage

browser.system.storage API ไม่รองรับใน Googlebook OS ส่วนขยายที่ประกาศสิทธิ์ system.storageใน manifest.json จะยังคงติดตั้งและทำงานได้ แต่เนมสเปซ จะเป็น undefined ในขณะรันไทม์ ตรวจสอบว่าได้กำหนด API ก่อน เรียกใช้ getInfo(), ejectDevice() หรือลงทะเบียน Listener ของพื้นที่เก็บข้อมูล