התאמת התוסף ל-Googlebook OS

‫Googlebook OS היא מערכת הפעלה למכשירי Googlebook, שמבוססת על סטאק תוכנות Android ומשולבת עם יסודות של מחשבים שולחניים מ-ChromeOS. ‫Googlebooks תומך באותה פלטפורמת WebExtensions שקיימת ב-Windows, ב-macOS וב-ChromeOS, אבל יש כמה הבדלים באופן ההפעלה שלהם שם.

  • זיהוי פלטפורמה נדרש לעיתים רחוקות, אבל בדיקות קיימות עלולות להניב תוצאות שגויות כי ממשקי ה-API של התוספים מדווחים על android, בעוד שסוכן המשתמש מדווח על ChromeOS.
  • הודעות Native עדיין לא זמינות, אבל אנחנו עובדים על זה. ההודעות ינותבו לאפליקציית Android מותקנת ולא לקובץ הפעלה למחשב.
  • מקשי הקיצור משתמשים בקישורי מקשים של Linux ולא בערכים של chromeos.
  • כדי להשתמש ב-SharedArrayBuffer, צריך לאשר חסימה לגישה מדומיינים אחרים, והוא חייב לפעול בדף של תוסף או במסמך מחוץ למסך ולא בקובץ שירות.
  • ‫API שפועל רק ב-ChromeOS לא נתמך ב-Googlebook OS, גם אם סוכן המשתמש מדווח על Chrome OS. תוספים שמצהירים על ההרשאות האלה עדיין מותקנים, אבל מרחבי השמות של ה-API הם undefined בזמן הריצה.
  • ‫browser.system.storage לא נתמך ב-Googlebook OS, ולכן מרחב השמות של ה-API הוא undefined בזמן הריצה.

זיהוי פלטפורמה

רוב התוספים לא צריכים לזהות את מערכת ההפעלה Googlebook. מומלץ לפעול לפי השיטות המומלצות לפיתוח אתרים, כמו זיהוי תכונות ועיצוב רספונסיבי, במקום לבדוק באיזו מערכת הפעלה הדפדפן פועל.

אם התוסף כבר בודק את מערכת ההפעלה, ממשקי ה-API של התוסף וסוכן המשתמש מחזירים פלטפורמות שונות ב-Googlebook OS.

  • ‫chrome.runtime.getPlatformInfo().os returns 'android'. אם התוסף שלכם משתף קוד עם דפדפנים לנייד ומניח ש-'android' מייצג טלפון, משתמשי Googlebook יקבלו את ממשק המשתמש לנייד במחשב נייד.
  • ‫navigator.userAgent contains CrOS. לפריסת דף כללית, התאמה של Chromebook היא פתרון טוב. עם זאת, navigator.userAgentData.platform מחזירה 'Android', ואם התוסף בודק את סוכן המשתמש כדי להציג רמזים למקשי קיצור במקלדת של 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, כי שתי הפלטפורמות מדווחות על טוקן הפלטפורמה הקפוא 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 Client Hints.

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 לא יתאימו לזיהוי הזה.

במאמר זיהוי Googlebooks מוסבר איך לזהות Googlebooks מדפי אינטרנט או בשרת באמצעות רמזים ללקוח.

העברת הודעות נייטיב

העברת הודעות מקורית עדיין לא זמינה ב-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, כדי להשתמש ב-SharedArrayBuffer, התוספים צריכים לאשר חסימה לגישה מדומיינים אחרים באופן מפורש ב-manifest.json.

הפעלת חסימה לגישה מדומיינים אחרים מאפשרת שימוש ב-SharedArrayBuffer במסמכי תוספים כמו חלונות קופצים, דפי אפשרויות ומסמכים מחוץ למסך. עם זאת, הוא לא מפעיל את SharedArrayBuffer בקובצי שירות (service worker) של תוספים, כי Chrome עדיין לא תומך בבידוד בין מקורות שונים עבור קובצי שירות (בעיה מספר 40150182). אם הלוגיקה ברקע מסתמכת על SharedArrayBuffer (לדוגמה, כדי להפעיל WebAssembly עם שרשורים), מריצים את הקוד הזה במסמך מחוץ למסך במקום ב-service worker.

ממשקי API ל-ChromeOS בלבד

ממשקי API שמסומנים ב-ChromeOS only בהפניה ל-Chrome Extensions API (כמו documentScan,‏ fileSystemProvider,‏ vpnProvider ו-printing) לא נתמכים ב-Googlebook OS, למרות ש-navigator.userAgent כולל את CrOS. תוספים שמצהירים על ההרשאות האלה עדיין מותקנים ופועלים, אבל מרחבי השמות של ה-API הם undefined בזמן הריצה. לפני שקוראים למרחב שמות של API, כדאי לבדוק שהוא קיים במקום להסתמך על זיהוי של סוכן משתמש.

browser.system.storage

‫browser.system.storage API לא נתמך ב-Googlebook OS. תוספים שמצהירים על ההרשאה system.storage ב-manifest.json עדיין מותקנים ופועלים, אבל מרחב השמות הוא undefined בזמן הריצה. בודקים אם ה-API מוגדר לפני שמפעילים את getInfo() או ejectDevice(), או לפני שמגדירים מאזינים לאחסון.