<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script src="resources/hybrid-blob-util.js"></script>
<script>
description("Test for slicing blobs created by BlobBuilder sending them via XMLHttpRequest.");

var util = new HybridBlobTestUtil(runTests);

function runSliceTest(appendItems, ranges)
{
    var blob = util.appendAndCreateBlob(appendItems);
    var range = {'start':0, 'length':-1};
    for (var i = 0; i < ranges.length; ++i) {
        blob = blob.slice(ranges[i].start, ranges[i].start + ranges[i].length);
        range.start += ranges[i].start;
    }
    range.length = ranges[ranges.length - 1].length;
    var urlParameter = util.createUrlParameter(appendItems, range);
    util.uploadBlob(blob, urlParameter);
}

function runTests()
{
    var stringA = util.DataItem('A1234567|');
    var stringB = util.DataItem('B12345|');
    var stringC = util.DataItem('C12345678901|');

    var mixedArray = [ [ stringA, stringB, stringA ], stringC, [ stringA, stringB ] , stringA ];

    debug('* BlobBuilder.append(data) and then apply Blob.slice()');
    runSliceTest(stringA, [ {'start': 3,  'length': 12} ]);
    runSliceTest([stringA, stringB], [ {'start': 3,  'length': 12} ]);
    runSliceTest(mixedArray, [ {'start': 13, 'length': 40} ]);
    runSliceTest(mixedArray, [ {'start': 13, 'length': 40} ]);
    runSliceTest(mixedArray, [ {'start': 5,  'length': 32} ]);

    debug('* BlobBuilder.append(data) and then apply nested Blob.slice()');
    runSliceTest(mixedArray, [ {'start': 5,  'length': 32}, {'start': 2, 'length': 9} ]);
    runSliceTest(mixedArray, [ {'start': 13, 'length': 40}, {'start': 5, 'length': 17} ]);
}

if (window.eventSender)
    util.runTests();
else
    testFailed("This test is not interactive, please run using DumpRenderTree");

var successfullyParsed = true;
</script>
<script src="../../../../resources/js-test-post.js"></script>
</body>
</html>
