Теперь есть способ получить постоянный доступ на чтение и запись к файлам и папкам без необходимости многократного предоставления разрешений. В этой статье объясняется, как это работает. Прежде чем углубляться в детали, кратко рассмотрим текущее положение дел и решаемую проблему.
Проблемы текущего метода
API доступа к файловой системе позволяет разработчикам получать доступ к файлам на локальном жёстком диске пользователя для чтения и (опционально) записи. Одним из популярных приложений (среди многих других ), использующих этот API, является Visual Studio Code (VS Code), интегрированная среда разработки Microsoft, работающая непосредственно в браузере. При запуске VS Code появляется экран приветствия , где можно создать новый файл или открыть существующий файл или папку.
Если вы нажмете «Открыть папку» и выберете одну из папок на жестком диске, браузер спросит вас, хотите ли вы, чтобы VS Code имел доступ на просмотр этой папки.
После предоставления доступа вы сможете перемещаться по иерархии папок и открывать файлы в редакторе VS Code. При внесении изменений в любой из файлов браузер спросит, хотите ли вы предоставить доступ на редактирование этой папки.
Если вы разрешите это, значок файла в адресной строке изменится, и появится небольшая стрелка вниз, указывающая на наличие у приложения разрешений на чтение и запись. Чтобы изменить разрешения, нажмите на значок, а затем нажмите «Удалить доступ» , чтобы приложение больше не могло редактировать файлы.
Доступ сохраняется до закрытия последней вкладки исходного приложения. Если затем закрыть приложение и открыть его снова, VS Code позволит вам продолжить работу с того места, где вы остановились. При нажатии «Открыть недавние » VS Code предлагает открыть ранее открытую папку.
Но даже если вы уже предоставили разрешение на запись в папку, теперь вам нужно предоставить его снова. Это очень быстро утомляет. Прежде чем углубляться в решение, то есть в постоянные разрешения для API доступа к файловой системе, давайте разберёмся, как VS Code вообще запоминает последние папки?
В API доступа к файловой системе (File System Access API) доступ к файлам и папкам управляется через объекты FileSystemHandle
: FileSystemFileHandle
для файлов и FileSystemDirectoryHandle
для папок (каталогов). Оба объекта могут храниться в IndexedDB , что и реализовано в VS Code. В этом можно убедиться, открыв Chrome DevTools, на вкладке «Приложение» перейдите в раздел IndexedDB и выберите соответствующую таблицу vscode-filehandles-store
в базе данных vscode-web-db
.
Новый путь: что и когда меняется
Chrome запускает новую функцию, позволяющую пользователям по желанию предоставлять постоянный доступ к своим файлам и папкам, избавляя от необходимости постоянно запрашивать разрешение. Новое поведение можно наблюдать, начиная с Chrome 122. Чтобы протестировать его раньше, начиная с Chrome 120, переключите два флага chrome://flags/#file-system-access-persistent-permission
и chrome://flags/#one-time-permission
в положение «Включено» .
Во-первых, новое поведение заключается в новом трехстороннем запросе разрешений, который опционально позволяет пользователям предоставлять приложениям доступ к выбранным файлам и папкам при каждом посещении.
Этот новый трехсторонний запрос имеет следующие параметры:
- Разрешить это время: разрешает приложению доступ к файлам для текущего сеанса. (Это соответствует существующему поведению.)
- Разрешить при каждом посещении: предоставляет приложению неограниченный доступ, пока доступ не будет отозван. После предоставления приложению постоянного доступа вновь открываемые файлы и папки также будут доступны постоянно.
- Не разрешать: не разрешает приложению доступ к файлам. (Это соответствует существующему поведению.)
Во-вторых, новое поведение подразумевает появление нового раздела в настройках сайта, доступ к которому пользователи могут получить через значок запуска рядом с переключателем «Редактирование файлов» .
При нажатии на этот значок запуска открываются настройки конфиденциальности и безопасности соответствующего приложения, где пользователь видит список всех файлов и папок, к которым у приложения есть доступ. Доступ можно отозвать для каждого элемента, нажав на значок корзины. Отмена доступа для каждого элемента означает, что приложению по-прежнему будет предоставлен доступ ко всем файлам. Чтобы отозвать доступ для всех файлов, пользователь может нажать на значок в адресной строке, как описано ранее.
Как вызвать новое поведение
Никаких изменений в API доступа к файловой системе для разработчиков не предусмотрено. Чтобы активировать новое поведение с постоянными разрешениями, необходимо выполнить три способа с различными предварительными условиями:
- Пользователь должен был предоставить разрешение на доступ к файлу или папке (или нескольким файлам или папкам) во время последнего посещения источника, и приложение должно было сохранить соответствующие объекты
FileSystemHandle
в IndexedDB. При следующем посещении источника приложение должно извлечь любой из сохранённых объектовFileSystemHandle
из IndexedDB и вызвать его методFileSystemHandle.requestPermission()
. При выполнении этих предварительных условий будет отображен новый трёхсторонний запрос. - Источник должен был вызвать метод
FileSystemHandle.requestPermission()
дляFileSystemHandle
, к которому ранее был предоставлен доступ, но доступ к которому был автоматически отозван из-за того, что вкладка некоторое время находилась в фоновом режиме. (Автоматический отзыв разрешения работает по той же логике, что описана в статье Одноразовые разрешения в Chrome .) Если эти предварительные условия выполнены, будет отображен новый трёхсторонний запрос. - Пользователь должен установить приложение. Установленные приложения автоматически сохранят разрешения после предоставления доступа пользователем. В этом случае трёхстороннее приглашение не будет отображаться, вместо этого приложение по умолчанию получит новое поведение.
В первом и втором случаях в запросе перечислены все объекты FileSystemHandle
, к которым приложение ранее имело доступ, а не только тот, для которого вызывается метод requestPermission()
. В соответствии с принципом работы одноразовых разрешений , если пользователь отклоняет или отклоняет запрос более трёх раз, он перестаёт срабатывать, и вместо него отображается обычный запрос разрешения.
Попробуйте новое поведение
Если у вас есть поддерживаемая версия Chrome или установлены необходимые флаги, вы можете протестировать новое поведение в VS Code в веб-версии. Откройте папку и предоставьте доступ, затем закройте вкладку, откройте её снова и нажмите «Открыть недавние» (обратите внимание, что немедленная перезагрузка не активирует запрос, все вкладки должны быть закрыты). Выберите предыдущую папку, и появится новый запрос.
Выводы
Постоянные разрешения для API доступа к файловой системе — одна из самых востребованных функций API, и ошибка в реализации также пользуется большой популярностью, и многие разработчики отмечают её. Благодаря предоставлению этой функции разработчикам, и, прежде всего, пользователям, устраняется важный пробел в функциональности по сравнению с платформенно-зависимыми приложениями.
Благодарности
Эту публикацию просмотрели Кристин Холлингсворт , Остин Салливан и Рэйчел Эндрю .