<!DOCTYPE html><!-- webkit-test-runner [ internal:IsInAppBrowserPrivacyEnabled=true applicationBundleIdentifier=inAppBrowserPrivacyTestIdentifier ] -->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/resourceLoadStatistics/resources/util.js"></script>
</head>
<body onload="runTest()">
<script>
    description("Tests that the session is switched upon top frame navigation to an app-bound domain.");
    jsTestIsAsync = true;

    const appBoundOrigin = "http://127.0.0.1:8000";
    const nonAppBoundOrigin = "http://localhost:8000";
    const sessionCookieName = "sessionCookie";
    const persistentCookieName = "persistentCookie";
    const twoMinutesInSeconds = 120;

    function finishTest() {
        testRunner.setInAppBrowserPrivacyEnabled(false, finishJSTest);
    }
    
    function setSessionCookie() {
        document.cookie = sessionCookieName + "=1; path=/";
    }

    function setPersistentCookie() {
        document.cookie = persistentCookieName + "=1; path=/; Max-Age=" + twoMinutesInSeconds + ";";
    }

    function checkCookies(shouldHaveSessionCookie, shouldHavePersistentCookie) {
        let hasSessionCookie = (document.cookie + "").includes(sessionCookieName),
            hasPersistentCookie = (document.cookie + "").includes(persistentCookieName);

        if (shouldHaveSessionCookie && hasSessionCookie)
            testPassed("Should have and has the session cookie.");
        else if (shouldHaveSessionCookie && !hasSessionCookie) {
            testFailed("Should have but doesn't have the session cookie.");
            setEnableFeature(false, finishTest);
        } else if (!shouldHaveSessionCookie && hasSessionCookie) {
            testFailed("Shouldn't have but has the session cookie.");
            setEnableFeature(false, finishTest);
        } else
            testPassed("Shouldn't have and doesn't have the session cookie.");


        if (shouldHavePersistentCookie && hasPersistentCookie)
            testPassed("Should have and has the persistent cookie.");
        else if (shouldHavePersistentCookie && !hasPersistentCookie) {
            testFailed("Should have but doesn't have the persistent cookie.");
            setEnableFeature(false, finishTest);
        } else if (!shouldHavePersistentCookie && hasPersistentCookie) {
            testFailed("Shouldn't have but has the persistent cookie.");
            setEnableFeature(false, finishTest);
        } else
            testPassed("Shouldn't have and doesn't have the persistent cookie.");
    }

    function runTest() {
        switch (document.location.hash) {
            case "":
                testRunner.setInAppBrowserPrivacyEnabled(true, function () {
                    if (document.location.origin !== appBoundOrigin)
                        testFailed("Test is not starting out on " + appBoundOrigin + ".");
                    setEnableFeature(true, function() {
                        // Since the test manually sets the inAppBrowserPrivacy flag in the
                        // Network process, we need to re-establish an app-bound session by
                        // navigating away then back to the app-bound Domain before setting cookies.
                        document.location.href = nonAppBoundOrigin + "/in-app-browser-privacy/switch-session-on-navigation-to-app-bound-domain.html#step1";
                    });
                });
                break;
            case "#step1":
                document.location.href = appBoundOrigin + "/in-app-browser-privacy/switch-session-on-navigation-to-app-bound-domain.html#step2";
                break;
            case "#step2":
                if (document.location.origin !== appBoundOrigin)
                    testFailed("Step 2 is not on " + appBoundOrigin + ".");
                testRunner.setStatisticsHasHadUserInteraction(appBoundOrigin, true, function() {
                    setSessionCookie();
                    setPersistentCookie();
                    checkCookies(true, true);
                if (!testRunner.hasAppBoundSession()) {
                        testFailed("Origin did not start with app-bound session.");
                        setEnableFeature(false, finishTest);
                    } else
                        testPassed("Origin has app-bound session.");
                    document.location.href = nonAppBoundOrigin + "/in-app-browser-privacy/switch-session-on-navigation-to-app-bound-domain.html#step3";
                });
                break;
            case "#step3":
                document.location.hash = "#step4"
                checkCookies(false, false);
                if (document.location.origin !== nonAppBoundOrigin)
                    testFailed("Step 3 is not on " + nonAppBoundOrigin);
                testRunner.statisticsUpdateCookieBlocking(runTest);
                break;
            case "#step4":
                checkCookies(false, false);
                document.location.href = appBoundOrigin + "/in-app-browser-privacy/switch-session-on-navigation-to-app-bound-domain.html#step5";
                break;
            case "#step5":
                checkCookies(true, true);
                if (testRunner.hasAppBoundSession())
                    testPassed("Origin has app-bound session after navigation.");
                else
                    testFailed("Origin has no app-bound session after navigation.");
                setEnableFeature(false, finishTest);
                break;
            default:
                testFailed("Unknown hash.");
                setEnableFeature(false, finishTest);
        }
    }

</script>
</body>
</html>
