<!DOCTYPE html>
<title>Same-origin prerendering can access Web Database</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="resources/utils.js"></script>
<body>
<script>

setup(() => assertSpeculationRulesIsSupported());

async function insertQuery() {
  return new Promise(resolve => {
    const db = openDatabase("test", "1.0", "test database", 1024);
    db.transaction(function (tx) {
      tx.executeSql('CREATE TABLE IF NOT EXISTS foo (text)');
      tx.executeSql('INSERT INTO foo (text) VALUES ("bar")');
    }, function(error) {
      resolve(error);
    }, function() {
      resolve("Success");
    });
  });
}

async function selectQuery() {
  return new Promise(resolve => {
    const db = openDatabase("test", "1.0", "test database", 1024);
    db.transaction(function (tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS foo (text)');
        tx.executeSql('SELECT * FROM foo', [], function (tx, results) {
          resolve(results.rows.length);
        });
      }, function(tx, error) {
        resolve(error);
      });
  });
}

promise_test(async t => {
  const uid = token();
  const bc = new PrerenderChannel('prerender-channel', uid);

  const gotMessage = new Promise(resolve => {
    bc.addEventListener('message', e => {
      resolve(e.data);
    }, {
      once: true
    });
  });

  const insertResult = await insertQuery();
  assert_equals(insertResult, "Success",
        'primary page should be able to execute statements from Web Database.');

  // Start prerendering a page that attempts to access Web Database.
  startPrerendering(`resources/web-database-access.html?uid=${uid}`);
  const result = await gotMessage;

  assert_equals(
    result, "Success",
    'prerendering page should be able to read from Web Database');

  const selectResult = await selectQuery();
  assert_equals(
    selectResult, 2,
    'prerendering page should be able to write to Web Database');
}, 'prerendering page should be able to access Web Database');

</script>
</body>
