104 lines
3.5 KiB
JavaScript
104 lines
3.5 KiB
JavaScript
// 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]);
|
|
})
|