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