<html>
<body>
<script>
// This is a 10x10 24-bits RGB BMP image in white.
var imageString =
"Qk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAATCwAAEwsAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

// Raw image byets.
var imageRaw = window.atob(imageString).split("");

// 10x10x3 bytes are image data.
var pixelBytes = 300;
var beginByte = imageRaw.length - pixelBytes;

function generateNewImage()
{
    // Add 1 to image data.
    for (var i = beginByte; i < imageRaw.length; ++i) {
        var c = imageRaw[i].charCodeAt(0);
        if (c == 255) {
            imageRaw[i] = String.fromCharCode(0);
        } else {
            imageRaw[i] = String.fromCharCode(c+1);
            break;
        }
    }

    var bmpImage = new Image();
    bmpImage.src = "data:image/bmp;base64," + window.btoa(imageRaw.join(""));
    return bmpImage;
}

var imageCount = 0;
function addImage()
{
    if (imageCount >= 1000 * 1000)
        return;
    document.getElementById("imageCanvas").appendChild(generateNewImage());
    window.setTimeout("addImage()", 1);
}

function runTest()
{
    document.getElementById("dragFrame").contentWindow.location.href =
        "about:blank";
    addImage();
}
</script>
<p>To run this test:</p>
<p>1. Drag this text 10 times:
   <iframe id="dragFrame" width="50" height="30">.</iframe></p>
<p>2. Click this <button onclick="runTest();">Start</button> button.</p>
<p>3. Let it run for 5 minutes and browser shouldn't crash.</p>
<div id="imageCanvas"></div>

<script>
// Write this content to the iframe.
var content =
    "<" + "body" + ">" +
    "<" + "script" + ">" +
    "function dragStartHandler()" +
    "{" +
    "    var img = new Image();" +
    "    img.src = 'data:image/bmp;base64," + imageString + "';" +
    "    event.dataTransfer.setDragImage(img, 10, 10);" +
    "}" +
    "</" + "script" + ">" +
    "<span ondragstart='dragStartHandler()'" +
    "      style='-webkit-user-select:none;" +
    "             -webkit-user-drag: element;" +
    "             position: absolute; top: 0; left: 0;" +
    "             background-color: blue;'>HERE</span>" +
    "</" + "body" + ">";

var doc = document.getElementById("dragFrame");
doc.contentDocument.open();
doc.contentDocument.write(content);
doc.contentDocument.close();
</script>
</body>
</html>
