Теперь есть способ получить постоянный доступ на чтение и запись к файлам и папкам без необходимости многократного предоставления разрешений. В этом посте объясняется, как это работает. Прежде чем углубиться в детали, кратко рассмотрим существующее положение вещей и проблему, которая решается.
Проблемы с текущим методом
API доступа к файловой системе позволяет разработчикам получать доступ к файлам на локальном жестком диске пользователя для чтения и (необязательно) записи. Одним из популярных приложений (среди многих других ), использующих этот API, является Visual Studio Code (VS Code), интегрированная среда разработки Microsoft, которая запускается непосредственно в браузере. Когда вы открываете VS Code, вас встречает экран приветствия , где вы можете создать новый файл или открыть существующий файл или папку.
Если вы нажмете «Открыть папку» и выберете одну из папок на жестком диске, браузер спросит вас, хотите ли вы, чтобы VS Code имел доступ для просмотра к этой папке.
Предоставив доступ, вы сможете перемещаться по иерархии папок и открывать файлы в редакторе VS Code. Если вы внесете изменения в любой из файлов, браузер спросит вас, хотите ли вы предоставить доступ для редактирования к папке.
Если вы разрешите это, значок файла в адресной строке изменится и появится небольшая стрелка вниз, указывающая, что приложение имеет разрешения на чтение и запись. Чтобы изменить разрешения, щелкните значок и выберите «Удалить доступ» , чтобы приложение больше не могло редактировать файлы.
Доступ длится до тех пор, пока вы не закроете последнюю вкладку оригинала. Если вы затем закроете приложение и откроете его снова, VS Code позволит вам продолжить с того места, на котором вы остановились. При нажатии кнопки «Открыть последние» VS Code предлагает повторно открыть ранее открытую папку.
Но даже если вы ранее предоставили разрешение на запись в папку, теперь вам необходимо предоставить доступ снова. Это очень быстро утомляет. Прежде чем углубиться в решение, то есть постоянные разрешения для API доступа к файловой системе, как VS Code вообще удается запоминать последние папки?
В 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
для Enabled .
Во-первых, новое поведение состоит из нового трехстороннего запроса разрешения, который при необходимости позволяет пользователям предоставлять приложениям доступ к выбранным файлам и папкам при каждом посещении.
Эта новая трехсторонняя подсказка имеет следующие параметры:
- Разрешить это время: позволяет приложению иметь доступ к файлам текущего сеанса. (Это соответствует существующему поведению.)
- Разрешить при каждом посещении: позволяет приложению иметь бессрочный доступ, пока доступ не будет отозван. Как только приложению будет предоставлен постоянный доступ, вновь открываемые файлы и папки также будут доступны постоянно.
- Не разрешать: запретить приложению доступ к файлам. (Это соответствует существующему поведению.)
Во-вторых, новое поведение влечет за собой новый раздел в настройках сайта, доступ к которому пользователи могут получить через значок запуска рядом с переключателем редактирования файлов .
При нажатии на этот значок запуска открываются настройки конфиденциальности и безопасности для рассматриваемого приложения, где пользователь видит список элементов для всех файлов и папок, к которым приложение имеет доступ. Доступ можно отозвать для каждого элемента, щелкнув значок корзины. Удаление доступа к каждому элементу означает, что приложению по-прежнему будет предоставлен доступ к файлам в целом. Чтобы вообще отозвать доступ, пользователь может щелкнуть значок в адресной строке, как описано ранее.
Как вызвать новое поведение
В API доступа к файловой системе нет никаких изменений, касающихся разработчиков. Чтобы активировать новое поведение с постоянными разрешениями, существует три способа с различными предварительными условиями, которые необходимо выполнить:
- Пользователь должен предоставить разрешение файлу или папке (или нескольким файлам или папкам) во время последнего посещения источника, и приложение должно сохранить соответствующие объекты
FileSystemHandle
в IndexedDB. При следующем посещении источника приложение должно получить любой из сохраненных объектовFileSystemHandle
из IndexedDB, а затем вызвать свой методFileSystemHandle.requestPermission()
. Если эти предварительные условия выполнены, будет показано новое трехстороннее приглашение. - Источник должен был вызвать метод
FileSystemHandle.requestPermission()
дляFileSystemHandle
, доступ к которому был предоставлен ранее, но чей доступ был автоматически отозван из-за того, что вкладка некоторое время находилась в фоновом режиме. (Автоматический отзыв разрешений работает по той же логике, что описана в статье «Одноразовые разрешения в Chrome» .) Если эти предварительные условия выполнены, будет показано новое трехстороннее приглашение. - Пользователь должен установить приложение. Установленные приложения автоматически сохранят разрешения, как только пользователь предоставит доступ. В этом случае трехстороннее приглашение не будет отображаться, вместо этого приложение по умолчанию получит новое поведение.
В первом и втором случае в приглашении перечислены все объекты FileSystemHandle
, к которым приложение ранее имело доступ, а не только тот, для которого вызывается метод requestPermission()
. В соответствии с тем , как это работает с одноразовыми разрешениями , если пользователь отклоняет или отклоняет запрос более трех раз, он больше не срабатывает, и вместо этого отображается обычный запрос разрешения.
Попробуйте новое поведение
Если у вас есть поддерживающая версия Chrome или установлены необходимые флаги, вы можете протестировать новое поведение в VS Code в Интернете. Откройте папку и предоставьте доступ, затем закройте вкладку, откройте ее снова и нажмите «Открыть последние» (обратите внимание, что немедленная перезагрузка не работает для запуска запроса, необходимо закрыть все вкладки). Выберите предыдущую папку, и появится новое приглашение. Для более сокращенного тестового примера ознакомьтесь с демонстрацией Persistent File System Access и ознакомьтесь с ее исходным кодом .
Выводы
Постоянные разрешения для API доступа к файловой системе — одна из наиболее востребованных функций API, и ошибка реализации также очень популярна, и многие разработчики отмечают ее. Передавая эту функцию в руки разработчиков и, прежде всего, в руки пользователей, теперь закрывается важный пробел в функциях по сравнению с приложениями для конкретных платформ.
Благодарности
Этот пост был рецензирован Кристиной Холлингсворт , Остином Салливаном и Рэйчел Эндрю .