<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
passphrase = "page-passphrase";
let worker = new Worker("resources/worker-1.js");

function test()
{
    let mainTarget = WI.mainTarget;
    let workerTarget = Array.from(WI.targets).find((target) => target.type === WI.TargetType.Worker);
    if (!workerTarget) {
        InspectorTest.fail("Missing Worker Target");
        InspectorTest.completeTest();
        return;
    }

    let suite = InspectorTest.createAsyncSuite("Worker.Runtime.basic");

    suite.addTestCase({
        name: "Main.Runtime.evaluate",
        description: "Main target evaluation.",
        test(resolve, reject) {
            mainTarget.RuntimeAgent.evaluate("passphrase").then((payload) => {
                let remoteObject = WI.RemoteObject.fromPayload(payload.result, mainTarget);
                InspectorTest.log(`Target - ${mainTarget.displayName} - passphrase - ${remoteObject.description}`);
                resolve();
            }).catch(reject);
        }
    });

    suite.addTestCase({
        name: "Worker.Runtime.evaluate",
        description: "Worker target evaluation.",
        test(resolve, reject) {
            workerTarget.RuntimeAgent.evaluate("passphrase").then((payload) => {
                let remoteObject = WI.RemoteObject.fromPayload(payload.result, workerTarget);
                InspectorTest.log(`Target - ${workerTarget.displayName} - passphrase - ${remoteObject.description}`);
                resolve();
            }).catch(reject);
        }
    });

    suite.addTestCase({
        name: "Main.Runtime.RemoteObjectAndPropertyDescriptor.",
        description: "Should be able to dig further into RemoteObjects.",
        test(resolve, reject) {
            mainTarget.RuntimeAgent.evaluate("location").then((payload) => {
                let remoteObject = WI.RemoteObject.fromPayload(payload.result, mainTarget);
                remoteObject.getDisplayablePropertyDescriptors((propertyDescriptors) => {
                    let hrefPropertyDescriptor = propertyDescriptors.find((p) => p.name === "href");
                    let hrefValue = sanitizeURL(hrefPropertyDescriptor.value.description);
                    InspectorTest.log(`Target - ${mainTarget.displayName} - location and href - ${remoteObject.description}: ${hrefValue}`);
                    resolve();
               });
            });
        }
    });

    suite.addTestCase({
        name: "Worker.Runtime.RemoteObjectAndPropertyDescriptor.",
        description: "Should be able to dig further into RemoteObjects.",
        test(resolve, reject) {
            workerTarget.RuntimeAgent.evaluate("location").then((payload) => {
                let remoteObject = WI.RemoteObject.fromPayload(payload.result, workerTarget);
                remoteObject.getDisplayablePropertyDescriptors((propertyDescriptors) => {
                    let hrefPropertyDescriptor = propertyDescriptors.find((p) => p.name === "href");
                    let hrefValue = sanitizeURL(hrefPropertyDescriptor.value.description);
                    InspectorTest.log(`Target - ${workerTarget.displayName} - location and href - ${remoteObject.description}: ${hrefValue}`);
                    resolve();
               });
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test for RuntimeAgent in a Worker.</p>
</body>
</html>
