<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.layoutTestController)
        layoutTestController.setPrivateBrowsingEnabled(true);
    
    for (i in privateBrowsingStatements)
        theTransaction.executeSql(privateBrowsingStatements[i], [], privateBrowsingSuccessFunction, privateBrowsingErrorFunction);
}

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

function runTest()
{
    if (window.layoutTestController) {
        layoutTestController.dumpAsText();
        layoutTestController.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>
