Приватный режим (Incognito, Private Browsing) радикально меняет
модель работы веб-хранилищ. Для библиотек уровня абстракции, таких как
localForage, это выражается не в изменении API, а в изменении гарантий:
долговечность данных, доступные драйверы и размер квоты
становятся нестабильными или ограниченными политиками
браузера.
localForage опирается на три основных механизма хранения:
- IndexedDB (основной драйвер)
- WebSQL (устаревший fallback в некоторых браузерах)
- localStorage (резервный синхронный вариант)
В приватных режимах каждый из этих слоёв может вести себя по-разному,
вплоть до полного отключения.
Общая модель
работы localForage в приватном режиме
При инициализации localForage выполняет:
- Проверку доступности драйверов
- Попытку использования IndexedDB
- Переход на следующий доступный драйвер при ошибке
- Финальное падение на memory storage (если подключён вручную)
В приватных режимах ключевым становится то, что:
«доступен» ≠ «персистентен»
Даже если IndexedDB работает, данные могут:
- удаляться при закрытии вкладки или браузера
- храниться только в пределах сессии
- не переживать перезапуск браузера
IndexedDB в режиме инкогнито
Chrome / Chromium
В современных версиях Chromium-based браузеров IndexedDB в
инкогнито:
- обычно разрешён
- создаётся отдельный временный storage partition
- данные существуют только в рамках инкогнито-сессии
Особенности:
- после закрытия всех инкогнито-вкладок данные удаляются
- квота может быть уменьшена или динамически ограничена
- возможны редкие ограничения на фоновые транзакции
Для localForage это выглядит как полностью рабочий IndexedDB-драйвер,
но без персистентности.
Firefox Private Browsing
В Firefox поведение более строгие:
- IndexedDB доступен, но может быть эпhemeral
(временным)
- в некоторых конфигурациях используется отдельный профиль
хранения
- часть данных может не записываться при агрессивных
privacy-настройках
В контексте localForage это проявляется как:
- нестабильные записи при больших объёмах
- возможные SecurityError при инициализации базы
Safari (macOS / iOS Private
Mode)
Safari демонстрирует наиболее жёсткую модель:
- IndexedDB может быть ограничен или полностью отключён в private
mode
- localStorage часто возвращает поведение «есть API, но запись
невозможна»
- квота может быть установлена в ноль или почти ноль
Типичные последствия:
QuotaExceededError при первой записи
InvalidStateError при попытке открыть базу
- fallback-драйвер становится обязательным
localStorage в приватном
режиме
localStorage — наиболее проблемный слой.
Общие ограничения:
- может работать только в памяти
- может возвращать ошибки записи без предупреждений
- может очищаться при закрытии сессии
- часто ограничен по размеру сильнее обычного режима
Поведение в localForage:
Если localStorage выбран как драйвер:
setItem может не бросать ошибку сразу
- ошибка проявляется при превышении квоты
- возможна потеря данных без явного исключения (в некоторых
WebKit-сценариях)
WebSQL в приватных режимах
WebSQL считается устаревшим, но в некоторых WebView и Safari он всё
ещё встречается.
Поведение:
- часто отключён полностью в private mode
- либо работает как volatile storage
- может не инициализироваться вообще
localForage редко использует WebSQL в современных конфигурациях, но
как fallback он может быть причиной непредсказуемого поведения
драйвер-селекта.
Эпhemeral storage и
жизненный цикл данных
В приватных режимах появляется дополнительная модель хранения:
session-bound persistence
Характеристики:
- данные живут только пока активна приватная сессия
- закрытие последней приватной вкладки очищает storage
- перезапуск браузера полностью сбрасывает состояние
Для localForage это означает:
- API остаётся асинхронным и стабильным
- гарантия долговременного хранения исчезает
- кэширование становится временным буфером
Выбор драйвера
localForage в приватном режиме
Механизм выбора драйвера не меняется, но результат меняется
существенно:
Порядок обычно:
- IndexedDBDriver
- WebSQLDriver
- LocalStorageDriver
- Custom driver (memory)
В приватном режиме:
- IndexedDB может вернуться как «ok», но с ephemeral storage
- WebSQL часто исключается
- localStorage может выглядеть доступным, но нестабилен
Итог: библиотека почти всегда остаётся на IndexedDB, даже если это
временное хранилище.
Типичные ошибки и их
интерпретация
QuotaExceededError
Возникает при:
- резком ограничении временной квоты
- попытке записать большой объект
- заполнении ephemeral storage
localForage воспринимает это как обычную ошибку драйвера записи.
SecurityError
Причины:
- запрещён доступ к IndexedDB в private mode (Safari сценарии)
- политика приватности блокирует storage API
- iframe sandbox ограничивает storage
InvalidStateError
Возникает при:
- попытке открыть IndexedDB в состоянии, где storage не
инициализирован
- переходе между контекстами private/non-private
Потеря данных при закрытии
контекста
Ключевая особенность приватного режима:
- данные не гарантированно сохраняются
- даже успешные
setItem могут быть уничтожены после
закрытия браузера
Для localForage это означает, что:
- успешный
await setItem() не равен долговечности
- отсутствует механизм подтверждения персистентности
- API не различает ephemeral и persistent storage
Стратегии адаптации
поведения
Memory driver как fallback
В приватных режимах часто используется:
- memoryStorage driver (через localForage driver plugin)
Свойства:
- полностью in-memory
- не зависит от browser storage API
- гарантированно работает в любых private режимах
- теряет данные при перезагрузке страницы
Проверка работоспособности
storage
Типовая модель проверки:
- пробная запись тестового ключа
- чтение и удаление
- обработка исключений
Важно: в приватных режимах успешная проверка не гарантирует
долговечность.
Определение деградации
драйвера
localForage может работать в состоянии:
- IndexedDB «active»
- но фактически ephemeral
Это создаёт скрытую деградацию, когда:
- ошибок нет
- но данные исчезают при reload
Ограничения
производительности
В приватных режимах наблюдаются дополнительные эффекты:
- увеличенная стоимость транзакций IndexedDB
- более агрессивный garbage collection
- ограничение параллельных операций записи
- возможные задержки commit операций
localForage, как абстракция, не компенсирует эти ограничения.
Поведение в iframe и
sandbox-контекстах
Если localForage используется внутри:
- sandboxed iframe
- embedded webview
- privacy-hardened container
в приватном режиме:
- storage может быть полностью отключён
- IndexedDB доступен, но не связан с origin persistently
- данные живут только в памяти процесса
Ключевые
особенности модели приватного хранения
- API хранилища остаётся неизменным
- драйверы могут возвращать «ложно положительное» состояние
доступности
- персистентность становится недетерминированной
- поведение зависит от браузера и версии движка
- localForage не имеет встроенного различения ephemeral/persistent
storage
Итоговое поведение
данных в localForage
В приватных режимах возможны три состояния хранения:
- Полностью функциональное временное IndexedDB
- Ограниченное или ошибочное storage API
- Полный fallback в память (memory driver)
Общая характеристика:
операции остаются асинхронными и валидными на уровне API, но
гарантия сохранности данных исчезает или становится зависящей от сессии
браузера