// META: timeout=long // META: script=/common/get-host-info.sub.js // META: script=/common/utils.js // META: script=/common/dispatcher/dispatcher.js // META: script=/html/cross-origin-embedder-policy/credentialless/resources/common.js // META: script=./resources/common.js // "token()" is used to get unique value for every execution of the test. This // avoids potential side effects of one run toward the second. const g_db_store = token(); const g_db_name = token(); const g_db_version = 1; // A script storing "|id|=|value|" in IndexedDB. const write_script = (id, value, done) => ` // Open the database: const request = indexedDB.open("${g_db_name}", "${g_db_version}"); request.onupgradeneeded = () => { request.result.createObjectStore("${g_db_store}", {keyPath: "id"}); }; await new Promise(r => request.onsuccess = r); const db = request.result; // Write the value: const transaction_write = db.transaction("${g_db_store}", "readwrite"); transaction_write.objectStore("${g_db_store}").add({ id: "${id}", value: "${value}", }); await transaction_write.complete; db.close(); send("${done}", "Done"); `; // A script retrieving what was stored inside IndexedDB. const read_script = (done) => ` // Open the database: const request = indexedDB.open("${g_db_name}", "${g_db_version}"); await new Promise(r => request.onsuccess = r); const db = request.result; // Read: const transaction_read = db.transaction("${g_db_store}", "readonly"); const get_all = transaction_read.objectStore("${g_db_store}").getAll(); await new Promise(r => transaction_read.oncomplete = r); db.close(); send("${done}", JSON.stringify(get_all.result)); `; promise_test(async test => { // 4 actors: 2 credentialless iframe and 2 normal iframe. const origin = get_host_info().HTTPS_REMOTE_ORIGIN; const iframes = [ newIframeCredentialless(origin), newIframeCredentialless(origin), newIframe(origin), newIframe(origin), ]; // 1. Write a different key-value pair from the iframes in IndexedDB: const keys = iframes.map(token); const values = iframes.map(token); const response_queues = iframes.map(token); await Promise.all(iframes.map(async (_, i) => { send(iframes[i], write_script(keys[i], values[i], response_queues[i])); assert_equals(await receive(response_queues[i]), "Done"); })); // 2. Read the state from every iframes: const states = await Promise.all(iframes.map(async (_, i) => { send(iframes[i], read_script(response_queues[i])); const reply = JSON.parse(await receive(response_queues[i])); const state = {} for(entry of reply) state[entry.id] = entry.value; return state; })); // Verify the two credentialless iframe share the same state and the normal // iframe share a second state assert_equals(states[0][keys[0]], values[0]); assert_equals(states[0][keys[1]], values[1]); assert_equals(states[0][keys[2]], undefined); assert_equals(states[0][keys[3]], undefined); assert_equals(states[1][keys[0]], values[0]); assert_equals(states[1][keys[1]], values[1]); assert_equals(states[1][keys[2]], undefined); assert_equals(states[1][keys[3]], undefined); assert_equals(states[2][keys[0]], undefined); assert_equals(states[2][keys[1]], undefined); assert_equals(states[2][keys[2]], values[2]); assert_equals(states[2][keys[3]], values[3]); assert_equals(states[3][keys[0]], undefined); assert_equals(states[3][keys[1]], undefined); assert_equals(states[3][keys[2]], values[2]); assert_equals(states[3][keys[3]], values[3]); })