test_slowDatabaseInitialization.js (3697B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 const { PrincipalUtils } = ChromeUtils.importESModule( 7 "resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs" 8 ); 9 const { QuotaUtils } = ChromeUtils.importESModule( 10 "resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs" 11 ); 12 const { IndexedDBUtils } = ChromeUtils.importESModule( 13 "resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs" 14 ); 15 const { TestUtils } = ChromeUtils.importESModule( 16 "resource://testing-common/TestUtils.sys.mjs" 17 ); 18 19 async function testNewDatabase() { 20 const principal = PrincipalUtils.createPrincipal("https://example.com"); 21 const name = "test_slowStorageInitialization.js"; 22 23 info("Testing origin clearing requested after starting database work"); 24 25 info("Starting database opening"); 26 27 const openPromise = (function () { 28 const request = indexedDB.openForPrincipal(principal, name); 29 const promise = IndexedDBUtils.requestFinished(request); 30 return promise; 31 })(); 32 33 info("Waiting for database work to start"); 34 35 await TestUtils.topicObserved("IndexedDB::DatabaseWorkStarted"); 36 37 info("Starting origin clearing"); 38 39 const clearPromise = (async function () { 40 const request = Services.qms.clearStoragesForPrincipal(principal); 41 const promise = QuotaUtils.requestFinished(request); 42 return promise; 43 })(); 44 45 info("Waiting for database to finish opening"); 46 47 try { 48 await openPromise; 49 ok(false, "Should have thrown"); 50 } catch (e) { 51 ok(true, "Should have thrown"); 52 Assert.strictEqual(e.name, "UnknownError", "Threw right result code"); 53 } 54 55 info("Waiting for origin to finish clearing"); 56 57 await clearPromise; 58 } 59 60 async function testExistingDatabase() { 61 const principal = PrincipalUtils.createPrincipal("https://example.com"); 62 const name = "test_slowStorageInitialization.js"; 63 const objectStoreName = "foo"; 64 65 info("Testing origin clearing requested after starting database work"); 66 67 info("Ensuring a pre-existing database"); 68 69 { 70 const request = indexedDB.openForPrincipal(principal, name); 71 request.onupgradeneeded = function (event) { 72 const database = event.target.result; 73 database.createObjectStore(objectStoreName); 74 }; 75 const promise = IndexedDBUtils.requestFinished(request); 76 const database = await promise; 77 database.close(); 78 } 79 80 info("Starting database opening"); 81 82 const openPromise = (function () { 83 const request = indexedDB.openForPrincipal(principal, name); 84 const promise = IndexedDBUtils.requestFinished(request); 85 return promise; 86 })(); 87 88 info("Waiting for database work to start"); 89 90 await TestUtils.topicObserved("IndexedDB::DatabaseWorkStarted"); 91 92 info("Starting origin clearing"); 93 94 const clearPromise = (async function () { 95 const request = Services.qms.clearStoragesForPrincipal(principal); 96 const promise = QuotaUtils.requestFinished(request); 97 return promise; 98 })(); 99 100 info("Waiting for database to finish opening"); 101 102 try { 103 await openPromise; 104 ok(false, "Should have thrown"); 105 } catch (e) { 106 ok(true, "Should have thrown"); 107 Assert.strictEqual(e.name, "AbortError", "Threw right result code"); 108 } 109 110 info("Waiting for origin to finish clearing"); 111 112 await clearPromise; 113 } 114 115 /* exported testSteps */ 116 async function testSteps() { 117 add_task( 118 { 119 pref_set: [ 120 ["dom.indexedDB.databaseInitialization.pauseOnIOThreadMs", 2000], 121 ], 122 }, 123 testNewDatabase 124 ); 125 126 add_task( 127 { 128 pref_set: [ 129 ["dom.indexedDB.databaseInitialization.pauseOnIOThreadMs", 2000], 130 ], 131 }, 132 testExistingDatabase 133 ); 134 }