tor-browser

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

idb-partitioned-basic-iframe.html (2042B)


      1 <!doctype html>
      2 <meta charset="utf-8">
      3 <script>
      4 const dbName = "users";
      5 
      6 // Create the database at v1 and detect success via `onsuccess`.
      7 function createDatabase() {
      8  return new Promise((resolve, reject) => {
      9    var dbRequest = window.indexedDB.open(dbName, 1);
     10    dbRequest.onblocked = () => reject();
     11    dbRequest.onerror = () => reject();
     12    dbRequest.onsuccess = (e) => {
     13      e.target.result.close();
     14      resolve();
     15    }
     16  });
     17 }
     18 
     19 // Open the database at v2 and detect existance via `onupgradeneeded`.
     20 function doesDatabaseExist() {
     21  let didExist = false;
     22  return new Promise((resolve, reject) => {
     23    var dbRequest = window.indexedDB.open(dbName, 2);
     24    dbRequest.onblocked = () => reject();
     25    dbRequest.onerror = () => reject();
     26    dbRequest.onsuccess = (e) => {
     27      e.target.result.close();
     28      deleteDatabase().then(() => resolve(didExist));
     29    };
     30    dbRequest.onupgradeneeded = (e) => {
     31      didExist = e.oldVersion != 0;
     32    };
     33  });
     34 }
     35 
     36 // Delete the database and detect success via `onsuccess`.
     37 function deleteDatabase() {
     38  return new Promise((resolve, reject) => {
     39    var dbRequest = window.indexedDB.deleteDatabase(dbName);
     40    dbRequest.onblocked = () => reject();
     41    dbRequest.onerror = () => reject();
     42    dbRequest.onsuccess = () => resolve();
     43  });
     44 }
     45 
     46 window.addEventListener("load", () => {
     47  if (!parent.opener) {
     48    // Step 2
     49    createDatabase().then(() => {
     50      parent.postMessage(
     51        {message: "same-site iframe loaded"},
     52        parent.origin,
     53      );
     54    });
     55  } else {
     56    // Step 4
     57    doesDatabaseExist().then((result) => {
     58      parent.opener.postMessage(
     59        {
     60          message: "cross-site iframe loaded",
     61          doesDatabaseExist: result,
     62        },
     63        parent.opener.origin,
     64      );
     65    });
     66  }
     67 });
     68 
     69 // Step 6
     70 window.addEventListener("message", (e) => {
     71  if (e.data.message == "delete database") {
     72    deleteDatabase().then(() => {
     73      e.source.postMessage(
     74        {message: "database deleted"},
     75        e.source.origin,
     76      );
     77    });
     78  }
     79 });
     80 </script>