// META: title=FileSystemHandle cannot be posted to a non-secure context of the same origin // META: script=/common/get-host-info.sub.js 'use strict'; const kTargetURL = `${location.origin}/fs/resources/insecure-context-message-target.html`; const kHostURL = `${get_host_info().UNAUTHENTICATED_ORIGIN}/fs/resources/insecure-context-message-host.html?target=${encodeURIComponent(kTargetURL)}`; function nextMessage() { return new Promise(resolve => window.addEventListener('message', e => resolve(e.data), { once: true })); } let target; promise_setup(async () => { const ready = nextMessage(); const host = window.open(kHostURL); add_completion_callback(() => host.close()); const data = await ready; assert_equals(data.type, 'ready'); assert_false(data.isSecureContext, 'the target is not a secure context'); target = host.frames[0]; }); async function post(value) { const result = nextMessage(); target.postMessage(value, location.origin); return (await result).type; } promise_test(async () => { assert_equals(await post({ value: 1 }), 'message'); }, 'A plain object can be posted to a non-secure context of the same origin'); promise_test(async t => { const root = await navigator.storage.getDirectory(); const file = await root.getFileHandle('insecure-context-file', { create: true }); t.add_cleanup(() => root.removeEntry(file.name)); assert_equals(await post(file), 'messageerror'); }, 'FileSystemFileHandle cannot be posted to a non-secure context of the same origin'); promise_test(async t => { const root = await navigator.storage.getDirectory(); const directory = await root.getDirectoryHandle('insecure-context-directory', { create: true }); t.add_cleanup(() => root.removeEntry(directory.name)); assert_equals(await post(directory), 'messageerror'); }, 'FileSystemDirectoryHandle cannot be posted to a non-secure context of the same origin');