Постоянные разрешения для API доступа к файловой системе

Теперь есть способ получить постоянный доступ на чтение и запись к файлам и папкам без необходимости многократного предоставления разрешений. В этом посте объясняется, как это работает. Прежде чем углубиться в детали, кратко рассмотрим существующее положение вещей и проблему, которая решается.

Проблемы с текущим методом

API доступа к файловой системе позволяет разработчикам получать доступ к файлам на локальном жестком диске пользователя для чтения и (необязательно) записи. Одним из популярных приложений (среди многих других ), использующих этот API, является Visual Studio Code (VS Code), интегрированная среда разработки Microsoft, которая запускается непосредственно в браузере. Когда вы открываете VS Code, вас встречает экран приветствия , где вы можете создать новый файл или открыть существующий файл или папку.

Экран приветствия Visual Studio Code.

Если вы нажмете «Открыть папку» и выберете одну из папок на жестком диске, браузер спросит вас, хотите ли вы, чтобы VS Code имел доступ для просмотра к этой папке.

Код Visual Studio запрашивает доступ для просмотра.

Предоставив доступ, вы сможете перемещаться по иерархии папок и открывать файлы в редакторе VS Code. Если вы внесете изменения в любой из файлов, браузер спросит вас, хотите ли вы предоставить доступ для редактирования к папке.

Код Visual Studio запрашивает доступ для редактирования.

Если вы разрешите это, значок файла в адресной строке изменится и появится небольшая стрелка вниз, указывающая, что приложение имеет разрешения на чтение и запись. Чтобы изменить разрешения, щелкните значок и выберите «Удалить доступ» , чтобы приложение больше не могло редактировать файлы.

Код Visual Studio с подсказкой значка в адресной строке.

Доступ длится до тех пор, пока вы не закроете последнюю вкладку оригинала. Если вы затем закроете приложение и откроете его снова, VS Code позволит вам продолжить с того места, на котором вы остановились. При нажатии кнопки «Открыть последние» VS Code предлагает повторно открыть ранее открытую папку.

Visual Studio Code предлагает последние открытые файлы.

Но даже если вы ранее предоставили разрешение на запись в папку, теперь вам необходимо предоставить доступ снова. Это очень быстро утомляет. Прежде чем углубиться в решение, то есть постоянные разрешения для API доступа к файловой системе, как VS Code вообще удается запоминать последние папки?

Код Visual Studio запрашивает доступ для редактирования после перезагрузки.

В API доступа к файловой системе доступ к файлам и папкам управляется с помощью объектов FileSystemHandle : объектов FileSystemFileHandle для файлов и объектов FileSystemDirectoryHandle для папок (каталогов). Оба могут храниться в IndexedDB , и это именно то, что делает VS Code. Вы можете увидеть это, открыв Chrome DevTools, на вкладке «Приложение» перейдите в раздел IndexedDB и выберите соответствующую таблицу vscode-filehandles-store в базе данных vscode-web-db .

Chrome DevTools отлаживает код Visual Studio, показывая раздел IndexedDB с сохраненным FileSystemHandle.

Новый путь: что изменится и когда

Chrome запускает новое поведение, позволяющее пользователям по желанию предоставлять постоянный доступ к своим файлам и папкам, избегая необходимости постоянно повторно запрашивать пользователя. Новое поведение можно наблюдать начиная с Chrome 122. Чтобы протестировать его раньше, начиная с Chrome 120, переключите два флага chrome://flags/#file-system-access-persistent-permission и chrome://flags/#one-time-permission для Enabled .

Во-первых, новое поведение состоит из нового трехстороннего запроса разрешения, который при необходимости позволяет пользователям предоставлять приложениям доступ к выбранным файлам и папкам при каждом посещении.

Код Visual Studio с трехсторонним запросом разрешения.

Эта новая трехсторонняя подсказка имеет следующие параметры:

  • Разрешить это время: позволяет приложению иметь доступ к файлам текущего сеанса. (Это соответствует существующему поведению.)
  • Разрешить при каждом посещении: позволяет приложению иметь бессрочный доступ, пока доступ не будет отозван. Как только приложению будет предоставлен постоянный доступ, вновь открываемые файлы и папки также будут доступны постоянно.
  • Не разрешать: запретить приложению доступ к файлам. (Это соответствует существующему поведению.)

Во-вторых, новое поведение влечет за собой новый раздел в настройках сайта, доступ к которому пользователи могут получить через значок запуска рядом с переключателем редактирования файлов .

Настройки сайта Visual Studio Code со значком редактирования файла.

При нажатии на этот значок запуска открываются настройки конфиденциальности и безопасности для рассматриваемого приложения, где пользователь видит список элементов для всех файлов и папок, к которым приложение имеет доступ. Доступ можно отозвать для каждого элемента, щелкнув значок корзины. Удаление доступа к каждому элементу означает, что приложению по-прежнему будет предоставлен доступ к файлам в целом. Чтобы вообще отозвать доступ, пользователь может щелкнуть значок в адресной строке, как описано ранее.

Настройки конфиденциальности и безопасности Chrome для сайта vscode.dev.

Как вызвать новое поведение

В API доступа к файловой системе нет никаких изменений, касающихся разработчиков. Чтобы активировать новое поведение с постоянными разрешениями, существует три способа с различными предварительными условиями, которые необходимо выполнить:

  1. Пользователь должен предоставить разрешение файлу или папке (или нескольким файлам или папкам) во время последнего посещения источника, и приложение должно сохранить соответствующие объекты FileSystemHandle в IndexedDB. При следующем посещении источника приложение должно получить любой из сохраненных объектов FileSystemHandle из IndexedDB, а затем вызвать свой метод FileSystemHandle.requestPermission() . Если эти предварительные условия выполнены, будет показано новое трехстороннее приглашение.
  2. Источник должен был вызвать метод FileSystemHandle.requestPermission() для FileSystemHandle , доступ к которому был предоставлен ранее, но чей доступ был автоматически отозван из-за того, что вкладка некоторое время находилась в фоновом режиме. (Автоматический отзыв разрешений работает по той же логике, что описана в статье «Одноразовые разрешения в Chrome» .) Если эти предварительные условия выполнены, будет показано новое трехстороннее приглашение.
  3. Пользователь должен установить приложение. Установленные приложения автоматически сохранят разрешения, как только пользователь предоставит доступ. В этом случае трехстороннее приглашение не будет отображаться, вместо этого приложение по умолчанию получит новое поведение.

В первом и втором случае в приглашении перечислены все объекты FileSystemHandle , к которым приложение ранее имело доступ, а не только тот, для которого вызывается метод requestPermission() . В соответствии с тем , как это работает с одноразовыми разрешениями , если пользователь отклоняет или отклоняет запрос более трех раз, он больше не срабатывает, и вместо этого отображается обычный запрос разрешения.

Попробуйте новое поведение

Если у вас есть поддерживающая версия Chrome или установлены необходимые флаги, вы можете протестировать новое поведение в VS Code в Интернете. Откройте папку и предоставьте доступ, затем закройте вкладку, откройте ее снова и нажмите «Открыть последние» (обратите внимание, что немедленная перезагрузка не работает для запуска запроса, необходимо закрыть все вкладки). Выберите предыдущую папку, и появится новое приглашение. Для более сокращенного тестового примера ознакомьтесь с демонстрацией Persistent File System Access и ознакомьтесь с ее исходным кодом .

Выводы

Постоянные разрешения для API доступа к файловой системе — одна из наиболее востребованных функций API, и ошибка реализации также очень популярна, и многие разработчики отмечают ее. Передавая эту функцию в руки разработчиков и, прежде всего, в руки пользователей, теперь закрывается важный пробел в функциях по сравнению с приложениями для конкретных платформ.

Благодарности

Этот пост был рецензирован Кристиной Холлингсворт , Остином Салливаном и Рэйчел Эндрю .