Обновления IndexedDB для Internet Explorer 10 и приложений в стиле Metro

Группа разработчиков Internet Explorer и представители более широкого веб-сообщества продолжают вносить улучшения в спецификацию IndexedDB. IndexedDB является рабочим черновиком консорциума W3C, позволяющим хранить, искать и получать данные на устройстве пользователя, даже при отключенном подключении к Интернету. IndexedDB — это компонент общей веб-платформы Internet Explorer 10 и приложений в стиле Metro в операционной системе Windows 8 Consumer Preview.

В этой записи блога описаны изменения, внесенные в Internet Explorer 10 Consumer Preview для реализации новейшей версии данной спецификации консорциума W3C.

Изменения в управлении версиями

Самое значительное изменение касается того, как разработчики обновляют свои схемы баз данных (т. е. хранилища объектов, индексы) при переходе от одной версии к другой. Рабочая группа (включая Майкрософт) решила заменить API-интерфейс IDBDatabase.setVersion новым API IDBFactory.open. В новом API open используется дополнительный параметр, чтобы определить, хотите ли вы использовать текущую версию базы данных или желаете обновить схему базы данных до новой версии. Теперь API open возвращает объект IDBOpenDBRequest, позволяющий зарегистрироваться для события onupgradeneeded. В обработчике событий можно обновить схему используемой базы данных, добавив в нее дополнительные хранилища объектов и индексы.

Чтобы обновить существующий код, добавьте параметр version в свой метод open, заменив в нем вызов метода setVersion, и зарегистрируйте новый обработчик событий onupgradeneeded в IDBOpenDBRequest (см. ниже).

Пример старого кода — код, затрагиваемый данным изменением, выделен зеленым цветом

function openDBTest(dbName) {

var rq = window.msIndexedDB.open(dbName);

rq.onsuccess = successOpenningDB;

rq.onerror = failureHandler;

}

 

function successOpenningDB(evt) {

var db = evt.target.result;

var rq = db.setVersion("1");

rq.onsuccess = successHandler;

rq.onerror = failureHandler;

}

 

function successHandler(evt) {

//create schema

}

Пример нового кода — измененный код выделен желтым цветом

function openDBTest(dbName) {

var rq = window.msIndexedDB.open(dbName, 1);

rq.onsuccess = useDB;

rq.onupgradeneeded = successHandler;

rq.onerror = failureHandler;

}

 

function successHandler(evt) {

//create schema

}

Дополнительные изменения

Кроме того, в платформу нами были внесены несколько менее существенных (но все же достаточно важных) изменений:

  • Добавлен метод IDBCursor.advance(count). Этот метод позволяет пропускать записи в позиции курсора, что, в свою очередь, позволяет использовать сценарии разбивки на страницы. Параметр count определяет количество записей, которые требуется пропустить перед доступом к данным. Допустимыми являются значения, превышающие или равные 1.

  • Добавлены методы IDBObjectStore.count(key) и IDBIndex.count(key). Они позволяют подсчитывать количество записей, отвечающих определенным критериям. Если не указано значение ключа (key), возвращается суммарное количество записей в индексе или хранилище объектов.

  • Добавлен метод IDBFactory.cmp(first, second). Этот метод сравнивает два значения ключа, чтобы определить, превышает ли одно значение другое или же они равны друг другу.

  • IDBKeyRanges теперь работает с дополнительными методами, включая IDBObjectStore.count, IDBObjectStore.delete, IDBIndex.count. Благодаря этому можно сопоставлять записи, охватывающие группы значений ключа.

  • Значения, добавляемые в базу данных, больше не должны удовлетворять всем определенным ранее индексам. Благодаря этому можно добавлять в IDBObjectStore записи, выходящие за пределы определенных ранее индексов.

  • Если в контексте активной транзакции возникает исключение, транзакция прерывается. Это означает, что если в обработчике событий onsuccess любого запроса возникает исключение, активная транзакция будет прервана. Однако обработка исключения позволит продолжить выполнение транзакции базы данных в нормальном режиме.

    // This won’t abort the transaction because there is no active transaction.

    function createTransaction() {

    var txn = db.transaction("test");

    window.aaaaaa();

    }

     

    // This will abort the transaction because the exception is thrown when there is an active transaction.

    var rq = objectStore.add(record);

    rq.onsuccess = function (event) {

    window.aaaaaa();

    }

  • Добавлена поддержка свойств индекса для большого двоичного объекта (BLOB-объекта). Это позволяет загружать двоичные данные из Интернета, хранить их локально, а также использовать свойства BLOB-объекта (например, имя, размер и т. д.) в качестве индексов или уникальных ключей в BLOB-объекте. Эта функциональность позволяет реализовать такие сценарии, как прослушивание музыкальной коллекции или просмотр фотографий и видео в автономном режиме с возможностью одновременно выполнять поиск в коллекции с использованием имени BLOB-объекта. В нашей новейшей демонстрации на сайте тестирования Internet Explorer показано, как можно использовать эту функциональность для автономного просмотра альбомов Facebook.

    Снимок экрана демонстрации "Компаньон Facebook" с сайта тестового выпуска Internet Explorer
    Снимок экрана демонстрации Компаньон Facebook с сайта тестового выпуска Internet Explorer

Кроме того, мы отправили рабочей группе консорциума W3C по IndexedDB более 100 тестовых случаев, включая новые тесты и обновления существующих.

Управление использованием IndexedDB сайтами и приложениями

В дополнение к обновлениям, обеспечивающим соответствие изменениям в спецификации консорциума W3C, версия Windows 8 Consumer Preview включает улучшения, предоставляющие пользователям возможность управлять тем, как сайты и приложения используют IndexedDB на их устройствах:

  • Представлен обработчик удаления для приложений в стиле Metro, использующих IndexedDB. Этот обработчик гарантирует, что каждый раз, когда конечный пользователь удаляет приложение, связанные данные в базе данных IndexedDB приложения будут автоматически удаляться в процессе удаления этого приложения.
  • Реализованы квоты (ограничения хранилища), чтобы предотвратить исчерпание дискового пространства сайтами. Квоты могут обновляться ИТ-администраторами или пользователями, имеющими административные права на доступ к реестру, с помощью параметров групповой политики. Однако квоты не применяются к приложениям в стиле Metro.
  • Добавлен новый интерфейс браузера, с помощью которого конечные пользователи могут управлять своими базами данных и квотами. Они могут использовать диалоговое окно [Caches and databases] (Кэши и базы данных) для удаления отдельных баз данных. Или вы можете удалить все базы данных, установив в диалоговом окне "Удаление истории обзора" флажок [Cookies and Web site data] (Файлы Cookie и данные веб-сайтов).

Снимок экрана, на котором представлена новая вкладка [Caches and databases] (Кэши и базы данных) диалогового окна [Website Data Settings] (Параметры данных веб-сайтов). На ней вы можете разрешать веб-сайтам создавать кэши и базы данных и задавать их максимальный размер.Снимок экрана, на котором представлено обновленное диалоговое окно "Удаление истории обзора" с новым текстом параметра управления файлами Cookie, содержащим данные веб-сайтов. В частности, к данным веб-сайтов относятся базы данных, создаваемые веб-сайтами.
Снимки экрана, на которых представлена новая вкладка [Caches and databases] (Кэши и базы данных) диалогового окна [Website Data Settings] (Параметры данных веб-сайтов) и обновленное диалоговое окно "Удаление истории обзора".

Заглядывая вперед

Рабочая группа по веб-приложениям консорциума W3C продолжает работу над завершением спецификации IndexedDB, внося важные улучшения и сокращая количество и область охвата вносимых изменений. Это важный этап для веб-разработчиков, которые будут использовать эту технологию в ближайшем будущем, в том числе в Windows 8 и Internet Explorer 10.

С нетерпением ожидаем, когда сможем ознакомиться с результатами использования IndexedDB на ваших сайтах и в приложениях, а также ваших отзывов на поддержку IndexedDB в Internet Explorer 10.

— Израэль Хилерио (Israel Hilerio), д-р наук, старший руководитель программы, Internet Explorer