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>