tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

request-abort-ordering.any.js (3107B)


      1 // META: title=IndexedDB: request abort events are delivered in order
      2 // META: global=window,worker
      3 // META: script=resources/support-promises.js
      4 // META: script=resources/support.js
      5 
      6 // Spec: https://w3c.github.io/IndexedDB/#abort-transaction
      7 
      8 'use strict';
      9 
     10 promise_test(testCase => {
     11  let requests;
     12 
     13  return createDatabase(
     14             testCase,
     15             (database, transaction) => {
     16               createBooksStore(testCase, database);
     17             })
     18      .then(database => {
     19        const transaction = database.transaction(['books'], 'readwrite');
     20        const store = transaction.objectStore('books');
     21        const index = store.index('by_author');
     22        const cursorRequest = store.openCursor(IDBKeyRange.lowerBound(0));
     23 
     24        return new Promise((resolve, reject) => {
     25          cursorRequest.onerror = testCase.step_func(event => {
     26            event.preventDefault();
     27            reject(cursorRequest.error);
     28          });
     29 
     30          cursorRequest.onsuccess = testCase.step_func(() => {
     31            const cursor = cursorRequest.result;
     32            requests = [
     33              () => store.get(123456),
     34              () => index.get('Fred'),
     35              () => store.count(),
     36              () => index.count(),
     37              () =>
     38                  store.put({title: 'Bedrock II', author: 'Barney', isbn: 987}),
     39              () => store.getAll(),
     40              () => index.getAll(),
     41              () => store.get(999999),
     42              () => index.get('Nobody'),
     43              () => store.openCursor(IDBKeyRange.lowerBound(0)),
     44              () => index.openCursor(IDBKeyRange.lowerBound('')),
     45              () => {
     46                cursor.continue();
     47                return cursorRequest;
     48              },
     49            ];
     50 
     51            const results = [];
     52            const promises = [];
     53            for (let i = 0; i < requests.length; ++i) {
     54              promises.push(new Promise((resolve, reject) => {
     55                const requestId = i;
     56                const request = requests[i](store);
     57                request.onsuccess = testCase.step_func(() => {
     58                  reject(new Error(
     59                      'IDB requests should not succeed after transaction abort'));
     60                });
     61                request.onerror = testCase.step_func(event => {
     62                  event.preventDefault();
     63                  results.push([requestId, request.error]);
     64                  resolve();
     65                });
     66              }));
     67            };
     68            transaction.abort();
     69            resolve(Promise.all(promises).then(() => results));
     70          });
     71        });
     72      })
     73      .then(results => {
     74        assert_equals(
     75            results.length, requests.length,
     76            'Promise.all should resolve after all sub-promises resolve');
     77        for (let i = 0; i < requests.length; ++i) {
     78          assert_equals(
     79              results[i][0], i, 'error event order should match request order');
     80          assert_equals(
     81              results[i][1].name, 'AbortError',
     82              'transaction aborting should result in AbortError on all requests');
     83        }
     84      });
     85 });