<!DOCTYPE html><metacharset=utf-8><title>IDBFactory.databases() and opaque origins</title><scriptsrc="/resources/testharness.js"></script><scriptsrc="/resources/testharnessreport.js"></script><script>functionload_iframe(src,sandbox){returnnewPromise(resolve=>{constiframe=document.createElement('iframe');iframe.onload=()=>{resolve(iframe);};if(sandbox)iframe.sandbox=sandbox;iframe.srcdoc=src;iframe.style.display='none';document.documentElement.appendChild(iframe);});}functionwait_for_message(recipient,source){returnnewPromise(resolve=>{recipient.onmessage=functionlistener(e){if(e.source===source){resolve(e.data);recipient.removeEventListener('message',listener);}};})}consttest_code=' const handler = (reply) => {'+' try { '+' if (!indexedDB || !indexedDB.databases) {'+' reply({result: "indexedDB.databases undefined"});'+' }'+' indexedDB.databases().then('+' () => reply({result: "no exception"}),'+' ex => reply({result: ex.name}));'+' } catch(e) { '+' reply({result: e.name + " thrown, not rejected"});'+' }'+' };';constiframe_script='<script>'+test_code+' window.onmessage = () => {'+' handler(msg => window.parent.postMessage(msg, "*"));'+' };'+'<\/script>';promise_test(asynct=>{constiframe=awaitload_iframe(iframe_script);iframe.contentWindow.postMessage({},'*');constmessage=awaitwait_for_message(self,iframe.contentWindow);assert_equals(message.result,'no exception','IDBFactory.databases() should not reject');},'IDBFactory.databases() in non-sandboxed iframe should not reject');promise_test(asynct=>{constiframe=awaitload_iframe(iframe_script,'allow-scripts');iframe.contentWindow.postMessage({},'*');constmessage=awaitwait_for_message(self,iframe.contentWindow);assert_equals(message.result,'SecurityError','Promise should be rejected with SecurityError');},'IDBFactory.databases() in sandboxed iframe should reject');constworker_script=`${test_code}// For dedicated workers:self.addEventListener("message", () => handler(self.postMessage));// For shared workers:self.addEventListener("connect", (e) => { var port = e.ports[0]; handler(msg => port.postMessage(msg));});`;constworker_data_url="data:,".concat(encodeURIComponent(worker_script));promise_test(asynct=>{letworker=newWorker(worker_data_url);t.add_cleanup(()=>worker.terminate());worker.postMessage({});constmessage=awaitwait_for_message(worker,null);assert_equals(message.result,'SecurityError','Promise should be rejected with SecurityError');},'IDBFactory.databases() in data URL dedicated worker should throw SecurityError');promise_test(asynct=>{letworker=newSharedWorker(worker_data_url,'idb_databases_opaque');worker.port.postMessage({});constmessage=awaitwait_for_message(worker.port,null);assert_equals(message.result,'SecurityError','Promise should be rejected with SecurityError');},'IDBFactory.databases() in data URL shared worker should throw SecurityError');</script>