https://github.com/web-platform-tests/wpt
Raw File
Tip revision: 669e6d2559b0b9403c01cd6f7837c951692738f4 authored by Darren Shen on 03 April 2018, 10:47:38 UTC
[css-typed-om] Add a few keyword properties.
Tip revision: 669e6d2
wasm_indexeddb_test.js
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var db_name = "db_wasm_test";
var obj_store = 'store';
var module_key = 'my_module';

function createAndSaveToIndexedDB(db_name) {
  return createWasmModule()
    .then(mod => new Promise((resolve, reject) => {
      var delete_request = indexedDB.deleteDatabase(db_name);
      delete_request.onsuccess = function() {
        var open_request = indexedDB.open(db_name);
        open_request.onupgradeneeded = function() {
          var db = open_request.result;
          db.createObjectStore(obj_store);
        };
        open_request.onsuccess = function() {
          var db = open_request.result;
          var tx = db.transaction(obj_store, 'readwrite');
          var store = tx.objectStore(obj_store);
          try {
            store.put(mod, module_key);
          } catch(e) {
            db.close();
            reject(e);
            return;
          }
          tx.oncomplete = function() {
            db.close();
            resolve();
            return;
          };
        };
      };
    }));
}

function loadFromIndexedDB(db_name) {
  var open_request = indexedDB.open(db_name);

  return new Promise((resolve, reject) => {
    open_request.onsuccess = function() {
      var db = open_request.result;
      var tx = db.transaction(obj_store);
      var store = tx.objectStore(obj_store);
      var get_request = store.get(module_key);
      get_request.onsuccess = function() {
        var mod = get_request.result;
        db.close();
        assert_true(mod instanceof WebAssembly.Module);
        try {
          var instance = new WebAssembly.Instance(mod);
          resolve(instance.exports.increment(1));
        } catch(e) {
          reject(e);
        }
      };
      get_request.onerror = reject;
    };
  });
}

function TestIndexedDBLoadStoreSecure() {
  return createAndSaveToIndexedDB(db_name)
    .then(() => loadFromIndexedDB(db_name))
    .then(res => assert_equals(res, 2),
          error => assert_unreached(error));
}

function TestIndexedDBLoadStoreInsecure() {
  return createAndSaveToIndexedDB(db_name)
    .then(assert_unreached,
          error => {
            assert_true(error instanceof DOMException);
            assert_equals(error.name, 'DataCloneError');
          });
}

function SaveToIDBAndLoadInWorker() {
  return createAndSaveToIndexedDB(db_name)
  .then(() => {
    var worker = new Worker("wasm_idb_worker.js");
    return new Promise((resolve, reject) => {
      worker.onmessage = function (event) {
        if (typeof (event.data) == "string") {
          resolve(event.data);
          worker.terminate();
          worker = undefined;
        }
      };
      worker.postMessage({command: "load", db_name: db_name});
    })
  })
.then(data => assert_equals(data, "ok"),
    error => assert_unreached(error));
}

function SaveToIDBInWorkerAndLoadInMain() {
  var worker = new Worker("wasm_idb_worker.js");
  var ret = new Promise((resolve, reject) => {
    worker.onmessage = function (event) {
      if (typeof (event.data) == "string") {
        resolve(event.data);
        worker.terminate();
        worker = undefined;
      }
    };
  })
  worker.postMessage({command: "save", db_name: db_name});
  return ret
    .then(data => assert_equals(data, "ok"),
          error => assert_unreached(error))
    .then(() => loadFromIndexedDB(db_name))
    .then(res => assert_equals(res, 2),
          assert_unreached);
}
back to top