אפשר לאפליקציות אינטרנט מותקנות להיות handlers של קבצים

רישום אפליקציה כ-handler של קבצים במערכת ההפעלה.

עכשיו, כשאפליקציות אינטרנט מסוגלות לקרוא ולכתוב קבצים, הלוגיקה הבאה היא הוא לאפשר למפתחים להצהיר על אפליקציות האינטרנט האלה כרכיבי handler של קבצים שהאפליקציות שלהם יכולות ליצור ולעבד. אפשר לעשות את זה בדיוק עם File Treatment API. אחרי רישום של הודעת טקסט בתור handler של קבצים, אחרי שמתקינים אותה, אפשר ללחוץ לחיצה ימנית על קובץ .txt ב-macOS. בוחרים באפשרות Get Info (הצגת מידע) כדי להורות למערכת ההפעלה לפתוח קבצים של .txt תמיד עם האפליקציה הזו כ- כברירת מחדל.

תרחישים לדוגמה של שימוש ב-File Treatment API

דוגמאות לאתרים שבהם אפשר להשתמש ב-API הזה:

  • אפליקציות Office, כמו עורכי טקסט, אפליקציות של גיליונות אלקטרוניים ויוצרי מצגות.
  • כלים לעריכת גרפיקה וכלי שרטוט.
  • כלי עריכה ברמת משחקי הווידאו.

איך משתמשים ב-File Treatment API

שיפור הדרגתי

לא ניתן למלא פוליגונים ל-File Treatment API ל-API. הפונקציונליות של פתיחת קבצים באמצעות רשת עם זאת, ניתן להשיג את האפליקציה בשני אמצעים אחרים:

  • Web Share Target API מאפשר למפתחים לציין את האפליקציה שלהם כיעד לשיתוף כדי שניתן יהיה לפתוח את הקבצים מגיליון השיתוף של מערכת ההפעלה.
  • אפשר לשלב את File System Access API עם גרירה ושחרור של קבצים, כדי מפתחים יכולים לטפל בקבצים שהושמטו באפליקציה שכבר פתוחה.

תמיכה בדפדפנים

תמיכה בדפדפן

  • Chrome: 102.
  • קצה: 102.
  • Firefox: לא נתמך.
  • Safari: לא נתמך.

מקור

זיהוי תכונות

כדי לבדוק אם יש תמיכה ב-File Treatment API, משתמשים בפקודה:

if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
  // The File Handling API is supported.
}

החלק ההצהרתי ב-File Treatment API

בשלב הראשון, אפליקציות אינטרנט צריכות לתאר באופן הצהרתי במניפסט של אפליקציית האינטרנט באיזה סוג של קבצים הם יכולים לטפל. File Treatment API מרחיב את המניפסט של אפליקציית האינטרנט באמצעות שנקרא '"file_handlers"', שמקבל מערך של רכיבי handler של קבצים. handler של קבצים הוא אובייקט עם המאפיינים האלו:

  • נכס "action" שמפנה אל כתובת URL שבהיקף האפליקציה כערך שלה.
  • מאפיין "accept" עם אובייקט מסוג MIME כמפתחות ורשימות של סיומות קבצים ערכים.
  • נכס "icons" עם מערך של ImageResource סמלים. חלק ממערכות ההפעלה מאפשרות לשיוך של סוג קובץ להציג סמל שאינו רק את סמל האפליקציה המשויך, אלא סמל מיוחד שקשור לשימוש בסוג הקובץ הזה עם האפליקציה.
  • מאפיין "launch_type" שמגדיר אם צריך לפתוח כמה קבצים בקובץ אחד או בכמה לקוחות. ערך ברירת המחדל הוא "single-client". אם המשתמש פותח מספר קבצים ואם ל-handler של הקבצים נוספו הערות עם "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 Treatment API

עכשיו, אחרי שהאפליקציה מצהירה על הקבצים שהיא יכולה לטפל בהם לפי כתובת URL רלוונטית, היא צריכה: חייבים לבצע בפועל פעולה כלשהי עם קבצים נכנסים. כאן launchQueue למשחק. כדי לגשת לקבצים שהופעלו, האתר צריך לציין צרכן עבור window.launchQueue לאובייקט. ההשקות מתווספות לתור עד שהן מטופלות על ידי הצרכן שצוין, וניתן להפעיל אותן פעם אחת בלבד בכל הפעלה. כך כל השקה מטופלת, בלי קשר למועד צוין צרכן.

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

חלון החיפוש של macOS עם קובץ Excalidraw.
לוחצים לחיצה כפולה או לוחצים לחיצה ימנית על קובץ בסייר הקבצים של מערכת ההפעלה.
תפריט ההקשר שמופיע כשלוחצים לחיצה ימנית על קובץ שבו האפשרות 'פתיחה באמצעות...' מודגשת.
Excalidraw הוא ה-handler של הקבצים שמוגדר כברירת מחדל ל-.excalidraw קבצים.

אבטחה

צוות Chrome תכנן והיישם את File Treatment API לפי עקרונות הליבה שהוגדרו בסעיף שליטה בגישה לתכונות אינטרנט מתקדמות, כולל שליטה על המשתמשים, וארגונומיה.

הרשאות, שמירה על עקביות ההרשאות ועדכונים בקשר ל-handler של קבצים

כדי לשמור על אמון המשתמשים ולשמור על הבטיחות שלהם קבצים, כש-File Treatment API פותח קובץ, תוצג בקשה להרשאה לפני ש-PWA תוכל לצפות בקובץ. בקשת ההרשאה הזו תוצג מיד אחרי שהמשתמש בוחר ב-PWA כדי לפתוח קובץ, כך שההרשאה מחוברת באופן הדוק פתיחת קובץ באמצעות PWA, כך שיהיה ברור ורלוונטי יותר.

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

כשהמניפסט מתעדכן ומשתנה בקטע "file_handlers", ההרשאות יאופסו.

יש קטגוריה גדולה של וקטורים של תקיפה שנפתחים על ידי מתן אפשרות לאתרים לגשת לקבצים. הנושאים האלה מפורטים מאמר על File System Access API. יכולת נוספת של אבטחה, שמספק ה-API לטיפול בקבצים ב-File System Access API הוא היכולת להעניק גישה לקבצים מסוימים דרך הממשק המובנה של מערכת ההפעלה בממשק משתמש, בניגוד לכלי לבחירת קבצים שמוצג על ידי אפליקציית אינטרנט.

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

אתגרים של handler שמוגדר כברירת מחדל

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

שליטת משתמשים

במפרט מצוין שדפדפנים לא יכולים לרשום כל אתר שיכול לטפל בקבצים כקובץ המטפל. במקום זאת, הרישום של טיפול בקבצים צריך להיות מוגבל מאחורי ההתקנה ואף פעם לא מתרחש ללא אישור מפורש של המשתמש, במיוחד אם אתר יהפוך ל-handler שמוגדר כברירת מחדל. במקום זאת מאשר לפרוץ תוספים קיימים, כמו .json, שכנראה כבר יש למשתמש handler שמוגדר כברירת מחדל רשומים אליהם, אתרים צריכים לשקול ליצור תוספים משלהם.

שקיפות

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

משוב

חברי צוות Chrome רוצים לשמוע על החוויה שלך עם File Treatment API.

מתארים את עיצוב ה-API

האם יש משהו ב-API שלא פועל כצפוי? או שחסרות שיטות או מאפיינים שאתם צריכים ליישום הרעיון שלכם? יש לכם שאלה או הערה בנושא האבטחה מודל טרנספורמר?

  • יש לדווח על בעיית מפרט במאגר GitHub המתאים, או להוסיף את דעתכם למאגר קיים בעיה.

דיווח על בעיה בהטמעה

מצאת באג בהטמעה של Chrome? או שההטמעה שונה מהמפרט?

  • דווחו על באג בכתובת new.crbug.com. חשוב לכלול כמה שיותר פרטים אפשר, הוראות פשוטות לשחזור, ולהזין UI>Browser>WebAppInstalls>FileHandling התיבה רכיבים. Glitch היא אפשרות נהדרת לשיתוף מהיר וקל תגובות.

הצגת תמיכה ב-API

האם את/ה מתכננ/ת להשתמש ב-File Treatment API? התמיכה הציבורית שלך עוזרת לצוות Chrome היא גם מראה לספקי דפדפנים אחרים עד כמה זה חשוב לתמוך בהם.

קישורים שימושיים

אישורים

EricWilligers ה-API לטיפול בקבצים צוין על ידי EricWilligers. ג'יי האריס, וגם ריימס חורי. המאמר הזה נבדק על ידי ג'ו מדלי.