<html>
<head>
<script>

function writeMessageToLog(message)
{
    document.getElementById("console").innerText += message + "\n";
}

var setupStatements = [
    "CREATE TABLE IF NOT EXISTS PrivateTest1 (randomData)",
    "INSERT INTO PrivateTest1 VALUES ('somedata')"
];

var privateBrowsingStatements = [
    "CREATE TABLE IF NOT EXISTS PrivateTest2 (randomData)",
    "DELETE FROM PrivateTest1",
    "DROP TABLE PrivateTest1",
    "INSERT INTO PrivateTest1 VALUES ('somedata')",
    "SELECT * FROM PrivateTest1"
];

var completed = 0;
var theTransaction;

function setupSuccessFunction(tx, result)
{
    ++completed;
    writeMessageToLog("Setup statement " + completed + " completed successfully");
    checkSetupComplete();
}

function setupErrorFunction(tx, error)
{
    ++completed;
    writeMessageToLog("Setup statement " + completed + " completed with an error\n" + error.message);
    checkSetupComplete();
}

function privateBrowsingSuccessFunction(tx, result)
{
    ++completed;
    writeMessageToLog("Private browsing statement " + completed + " completed successfully");
}

function privateBrowsingErrorFunction(tx, error)
{
    ++completed;
    writeMessageToLog("Private browsing statement " + completed + " completed with an error\n" + error.message);
    return false;
}

function runSetup(transaction)
{
    theTransaction = transaction;
    for (i in setupStatements)
        theTransaction.executeSql(setupStatements[i], [], setupSuccessFunction, setupErrorFunction);
}

function checkSetupComplete()
{
    if (completed == setupStatements.length)
        runPrivateBrowsingTests();
}

function runPrivateBrowsingTests()
{
    completed = 0;

    if (window.testRunner)
        testRunner.setPrivateBrowsingEnabled(true);
    
    for (i in privateBrowsingStatements)
        theTransaction.executeSql(privateBrowsingStatements[i], [], privateBrowsingSuccessFunction, privateBrowsingErrorFunction);
}

function endTest()
{
    writeMessageToLog("Test ended");
    
    if (window.testRunner)
        testRunner.notifyDone();
}

function runTest()
{
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    var database = openDatabase("PrivateBrowsingNoReadNoWriteTest", "1.0", "Test private browsing no read/write safety", 1);
    database.transaction(runSetup, endTest, endTest);
}

</script>
</head>
<body onload="runTest();">
This test makes sure that attempts to change the database during private browsing fail.<br>
<div id="console"></div>
</body>
</html>
