רישום אפליקציה כ-handler של קבצים במערכת ההפעלה.
עכשיו, כשאפליקציות אינטרנט יכולות לקרוא ולכתוב קבצים, השלב הבא הוא לאפשר למפתחים להגדיר את אפליקציות האינטרנט האלה כמטפלות בקבצים שהאפליקציות שלהם יכולות ליצור ולעבד. ה-API לטיפול בקבצים מאפשר לכם לעשות בדיוק את זה. אחרי שרושמים אפליקציית עריכת טקסט כטיפול בקבצים ואחרי שמתקינים אותה, אפשר ללחוץ לחיצה ימנית על קובץ .txt ב-macOS ולבחור באפשרות 'קבלת מידע'. כך אפשר להגדיר למערכת ההפעלה שקבצי .txt ייפתחו תמיד באפליקציה הזו כברירת מחדל.
תרחישי שימוש מומלצים ב-File Handling API
דוגמאות לאתרים שעשויים להשתמש ב-API הזה:
- אפליקציות Office כמו עורכי טקסט, אפליקציות של גיליונות אלקטרוניים וכלים ליצירת מצגות.
- עורכי גרפיקה וכלים לציור.
- כלים לעריכת רמות במשחקי וידאו.
איך משתמשים ב-File Handling API
שיפור הדרגתי
אי אפשר להשתמש ב-polyfill ב-File Handling API. אבל אפשר לפתוח קבצים באמצעות אפליקציית אינטרנט בשתי דרכים אחרות:
- Web Share Target API מאפשר למפתחים לציין את האפליקציה שלהם כיעד לשיתוף, כך שאפשר לפתוח קבצים מגיליון השיתוף של מערכת ההפעלה.
- אפשר לשלב את File System Access API עם גרירה ושחרור של קבצים, כך שמפתחים יכולים לטפל בקבצים ששוחררו באפליקציה שכבר פתוחה.
תמיכה בדפדפנים
זיהוי תכונות
כדי לבדוק אם File Handling API נתמך, משתמשים בפקודה:
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
// The File Handling API is supported.
}
החלק הדקלרטיבי של File Handling API
כשלב ראשון, אפליקציות אינטרנט צריכות לתאר באופן הצהרתי במניפסט של אפליקציית האינטרנט אילו סוגי קבצים הן יכולות לטפל בהם. File Handling API מרחיב את המניפסט של אפליקציית האינטרנט עם מאפיין חדש בשם "file_handlers" שמקבל מערך של, ובכן, קבצים לטיפול. מטפל בקבצים הוא אובייקט עם המאפיינים הבאים:
- מאפיין
"action"שמפנה לכתובת URL בתחום של האפליקציה כערך שלו. - מאפיין
"accept"עם אובייקט של סוגי MIME כמפתחות ורשימות של סיומות קבצים כערכים. - מאפיין
"icons"עם מערך של סמליImageResource. מערכות הפעלה מסוימות מאפשרות לשייך סוג קובץ להצגת סמל שהוא לא רק הסמל של האפליקציה המשויכת, אלא סמל מיוחד שקשור לשימוש בסוג הקובץ הזה עם האפליקציה. - מאפיין
"launch_type"שמגדיר אם לפתוח כמה קבצים בלקוח אחד או בכמה לקוחות. ערך ברירת המחדל הוא"single-client". אם המשתמש פותח כמה קבצים, ואם קובץ הטיפול תויג ב-"multiple-clients"בתור"launch_type", יתרחשו יותר מהשקה אחת של האפליקציה, ובכל השקה, למערךLaunchParams.files(ראו בהמשך) יהיה רק רכיב אחד.
הדוגמה הבאה, שבה מוצג רק הקטע הרלוונטי של מניפסט אפליקציית האינטרנט, תעזור להבין את זה טוב יותר:
{
"file_handlers": [
{
"action": "/open-csv",
"accept": {
"text/csv": [".csv"]
},
"icons": [
{
"src": "csv-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-svg",
"accept": {
"image/svg+xml": ".svg"
},
"icons": [
{
"src": "svg-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "single-client"
},
{
"action": "/open-graf",
"accept": {
"application/vnd.grafr.graph": [".grafr", ".graf"],
"application/vnd.alternative-graph-app.graph": ".graph"
},
"icons": [
{
"src": "graf-icon.png",
"sizes": "256x256",
"type": "image/png"
}
],
"launch_type": "multiple-clients"
}
]
}
זהו תיאור של אפליקציה היפותטית שמטפלת בקבצים של ערכים מופרדים בפסיקים (.csv) בכתובת /open-csv, בקבצים של גרפיקה וקטורית שניתנת להרחבה (.svg) בכתובת /open-svg, ובפורמט קובץ Grafr מומצא עם אחת מהסיומות .grafr, .graf או .graph בכתובת /open-graf. שני הראשונים ייפתחו בלקוח יחיד, והאחרון ייפתח בכמה לקוחות אם מטפלים בכמה קבצים.
החלק החשוב ב-File Handling API
עכשיו, אחרי שהאפליקציה הצהירה אילו קבצים היא יכולה לטפל בהם ובאילו כתובות URL בתחום, היא צריכה לעשות משהו עם הקבצים הנכנסים בפועל. כאן נכנס לתמונה launchQueue. כדי לגשת לקבצים שהופעלו, צריך לציין באתר צרכן עבור האובייקט window.launchQueue
object. ההפעלות מתווספות לתור עד שהן מטופלות על ידי הצרכן שצוין, שמופעל בדיוק פעם אחת לכל הפעלה. כך, כל השקה מטופלת, בלי קשר למועד שבו צוין הצרכן.
if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
launchQueue.setConsumer((launchParams) => {
// Nothing to do when the queue is empty.
if (!launchParams.files.length) {
return;
}
for (const fileHandle of launchParams.files) {
// Handle the file.
}
});
}
תמיכה בכלי הפיתוח
בזמן כתיבת המאמר הזה, אין תמיכה בכלי הפיתוח, אבל הגשתי בקשה להוספת תכונה כדי להוסיף תמיכה.
הדגמה (דמו)
הוספתי תמיכה בטיפול בקבצים ל-Excalidraw, אפליקציה ליצירת ציורים בסגנון קריקטורה. כדי לבדוק אותה, צריך קודם להתקין את Excalidraw. כשיוצרים קובץ באמצעות האפליקציה ושומרים אותו במקום כלשהו במערכת הקבצים, אפשר לפתוח את הקובץ באמצעות לחיצה כפולה, או לחיצה ימנית ואז בחירה באפשרות Excalidraw בתפריט ההקשר. אפשר לבדוק את ההטמעה בקוד המקור.
.excalidraw.
אבטחה
צוות Chrome תכנן והטמיע את File Handling API על סמך העקרונות המרכזיים שמוגדרים במאמר שליטה בגישה לתכונות עוצמתיות של פלטפורמת האינטרנט, כולל שליטה של המשתמש, שקיפות וארגונומיה.
הרשאות, שמירת הרשאות ועדכונים של קבצים
כדי לשמור על אמון המשתמשים ועל בטיחות הקבצים שלהם, כש-File Handling API פותח קובץ, מוצגת בקשת הרשאה לפני ש-PWA יכול להציג קובץ. ההודעה לבקשת הרשאה תוצג מיד אחרי שהמשתמש יבחר את אפליקציית ה-PWA כדי לפתוח קובץ. כך ההרשאה קשורה באופן הדוק לפעולה של פתיחת קובץ באמצעות אפליקציית ה-PWA, והיא תהיה מובנת ורלוונטית יותר.
ההרשאה הזו תוצג בכל פעם עד שהמשתמש ילחץ על אישור או על חסימה של הטיפול בקבצים באתר, או יתעלם מההנחיה שלוש פעמים (לאחר מכן Chromium יחסום את ההרשאה הזו). ההגדרה שנבחרה תישמר גם אחרי סגירה ופתיחה מחדש של אפליקציית ה-PWA.
כשהמניפסט מתעדכן ומתגלים שינויים בקטע "file_handlers", ההרשאות יאופסו.
בעיות שקשורות לקבצים
יש קטגוריה גדולה של וקטורי תקיפה שנפתחים כשמאפשרים לאתרים גישה לקבצים. הם מפורטים במאמר בנושא File System Access API. היכולת הנוספת שקשורה לאבטחה ומסופקת על ידי File Handling API מעבר ל-File System Access API היא האפשרות להעניק גישה לקבצים מסוימים דרך ממשק המשתמש המובנה של מערכת ההפעלה, בניגוד לבחירת קבצים שמוצגת על ידי אפליקציית אינטרנט.
עדיין קיים סיכון שהמשתמשים יפתחו קובץ ויעניקו לאפליקציית אינטרנט גישה אליו בלי לשים לב. עם זאת, מקובל להניח שפתיחת קובץ מאפשרת לאפליקציה שדרכה הוא נפתח לקרוא את הקובץ או לבצע בו שינויים. לכן, בחירה מפורשת של משתמש לפתוח קובץ באפליקציה מותקנת, למשל באמצעות תפריט הקשר 'פתיחה באמצעות…', יכולה להיחשב כאות מספיק של אמון באפליקציה.
אתגרים שקשורים ל-handler שמוגדר כברירת מחדל
היוצא מן הכלל הוא כשאין אפליקציות במערכת המארחת לסוג קובץ מסוים. במקרה כזה, יכול להיות שמערכות הפעלה מסוימות של המארח יקדמו אוטומטית את המטפל החדש שנרשם למטפל ברירת המחדל עבור סוג הקובץ הזה, בשקט וללא התערבות מצד המשתמש. המשמעות היא שאם המשתמש ילחץ לחיצה כפולה על קובץ מהסוג הזה, הוא ייפתח אוטומטית באפליקציית האינטרנט הרשומה. במערכות הפעלה כאלה של מארחים, כשסוכן המשתמש קובע שאין handler ברירת מחדל קיים לסוג הקובץ, יכול להיות שיהיה צורך בהנחיה מפורשת למתן הרשאה כדי למנוע שליחה מקרית של תוכן הקובץ לאפליקציית אינטרנט ללא הסכמת המשתמש.
שליטת משתמשים
במפרט מצוין שדפדפנים לא צריכים לרשום כל אתר שיכול לטפל בקבצים כמטפל בקבצים. במקום זאת, הרישום לטיפול בקבצים צריך להיות מוגבל להתקנה, ואסור שיקרה ללא אישור מפורש מהמשתמש, במיוחד אם האתר אמור להפוך לטיפול ברירת המחדל. במקום לחטוף תוספים קיימים כמו .json, שסביר להניח שהמשתמש כבר רשם עבורם טיפול ברירת מחדל, מומלץ לאתרים ליצור תוספים משלהם.
שקיפות
בכל מערכות ההפעלה, המשתמשים יכולים לשנות את שיוכי הקבצים הנוכחיים. הפעולה הזו לא מתבצעת בדפדפן.
משוב
צוות Chrome רוצה לשמוע על החוויה שלכם עם File Handling API.
מהו עיצוב ה-API?
האם יש משהו ב-API שלא פועל כמו שציפית? או שיש שיטות או מאפיינים חסרים שצריך להטמיע כדי לממש את הרעיון? יש לך שאלה או הערה לגבי מודל האבטחה?
- אפשר לפתוח בעיה במפרט במאגר GitHub המתאים, או להוסיף את המחשבות שלכם לבעיה קיימת.
דיווח על בעיה בהטמעה
מצאתם באג בהטמעה של Chrome? או שההטמעה שונה מהמפרט?
- מדווחים על הבאג בכתובת new.crbug.com. חשוב לכלול כמה שיותר פרטים, הוראות פשוטות לשחזור הבאג ומזינים
UI>Browser>WebAppInstalls>FileHandlingבתיבה Components.
תמיכה ב-API
האם אתם מתכננים להשתמש ב-File Handling API? התמיכה הציבורית שלכם עוזרת לצוות Chrome לתת עדיפות לתכונות, ומראה לספקי דפדפנים אחרים עד כמה חשוב לתמוך בהן.
- אפשר לשתף את התוכניות שלכם לשימוש ב-WICG Discourse thread.
- אפשר לשלוח ציוץ אל @ChromiumDev באמצעות ההאשטאג
#FileHandlingולספר לנו איפה ואיך אתם משתמשים בו.
קישורים שימושיים
- הסבר לציבור
- הדגמה של File Handling API | מקור ההדגמה של File Handling API
- באג במעקב ב-Chromium
- ערך ב-ChromeStatus.com
- רכיב Blink:
UI>Browser>WebAppInstalls>FileHandling - בדיקת תגים
- Mozilla Standards Position
תודות
ה-File Handling API הוגדר על ידי Eric Willigers, Jay Harris ו- Raymes Khoury. המאמר הזה נבדק על ידי Joe Medley.