<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
TestPage.allowUncaughtExceptions = true;
TestPage.needToSanitizeUncaughtExceptionURLs = true;

function triggerCSPExceptionInsideScript() {
    eval("console.log('Inside Script - CSP should prevent this')");
}

function triggerCSPExceptionOutsideScript() {
    let iframe = document.createElement("iframe");
    iframe.src = "resources/csp-exception-iframe.html";
    document.body.appendChild(iframe);
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("PauseOnCSPExceptionDoesNotCrash");

    suite.addTestCase({
        name: "TriggerCSPExceptionInsideOfScript",
        description: "Trigger a CSP Exception inside of script should pause.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("setTimeout(triggerCSPExceptionInsideScript)");
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                InspectorTest.pass("CSP Exception caused by script evaluation should pause.");
                WI.debuggerManager.resume();
            });

            WI.logManager.singleFireEventListener(WI.LogManager.Event.MessageAdded, (event) => {
                InspectorTest.assert(event.data.message.level === WI.ConsoleMessage.MessageLevel.Error);
                InspectorTest.pass("CSP Exception Console Message: " + event.data.message.messageText);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "TriggerCSPExceptionOutsideOfScript",
        description: "Trigger a CSP Exception outside of script should not pause or crash.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("setTimeout(triggerCSPExceptionOutsideScript)");
            let didPause = false;
            let tempPauseFailListener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                didPause = true;
                InspectorTest.fail("CSP Exception caused outside of script evaluation should not pause, but did.");
                WI.debuggerManager.resume();
                reject();
            });
            WI.logManager.singleFireEventListener(WI.LogManager.Event.MessageAdded, (event) => {
                WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, tempPauseFailListener, null);
                InspectorTest.assert(event.data.message.level === WI.ConsoleMessage.MessageLevel.Error);
                InspectorTest.expectFalse(didPause, "CSP Exception caused outside of script evaluation should not pause.");
                InspectorTest.pass("CSP Exception Console Message: " + event.data.message.messageText);
                resolve();
            });
        }
    });

    DebuggerAgent.setPauseOnExceptions("all");

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test for the CSP exception handling when pause on all exceptions is enabled.</p>
</body>
</html>
