Поведение в приватном режиме и режиме инкогнито

Приватный режим (Incognito, Private Browsing) радикально меняет модель работы веб-хранилищ. Для библиотек уровня абстракции, таких как localForage, это выражается не в изменении API, а в изменении гарантий: долговечность данных, доступные драйверы и размер квоты становятся нестабильными или ограниченными политиками браузера.

localForage опирается на три основных механизма хранения:

  • IndexedDB (основной драйвер)
  • WebSQL (устаревший fallback в некоторых браузерах)
  • localStorage (резервный синхронный вариант)

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


Общая модель работы localForage в приватном режиме

При инициализации localForage выполняет:

  1. Проверку доступности драйверов
  2. Попытку использования IndexedDB
  3. Переход на следующий доступный драйвер при ошибке
  4. Финальное падение на 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 в приватном режиме

Механизм выбора драйвера не меняется, но результат меняется существенно:

Порядок обычно:

  1. IndexedDBDriver
  2. WebSQLDriver
  3. LocalStorageDriver
  4. 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

В приватных режимах возможны три состояния хранения:

  1. Полностью функциональное временное IndexedDB
  2. Ограниченное или ошибочное storage API
  3. Полный fallback в память (memory driver)

Общая характеристика:

операции остаются асинхронными и валидными на уровне API, но гарантия сохранности данных исчезает или становится зависящей от сессии браузера