<html>
<head>
<title>Original Title</title>
<link rel="shortcut icon" type="image/x-icon" href="http://test.com/oldfavicon.ico"/>
<script>
function debugOutput(str) {
    text = document.createTextNode(str);
    debugDiv = document.getElementById('debugDiv');
    div = document.createElement ('div');
    div.appendChild(text);
    debugDiv.appendChild(div);
}

function createFavIconElement(iconURL) {
    var link = document.createElement("link");
    link.type = "image/x-icon";
    link.rel = "shortcut icon";
    link.href = iconURL;
    return link;
}

function getHeadElement() {
    return document.getElementsByTagName("head")[0];
}

function setFavIcon(iconURL) {
    var docHead = getHeadElement();
    var links = docHead.getElementsByTagName("link");
    for (var i = 0; i < links.length; ++i) {
      var link = links[i];
      if (link.type=="image/x-icon" && link.rel=="shortcut icon") {
        docHead.removeChild(link);
        break; // Assuming only one match at most.
      }
    }
    docHead.appendChild(createFavIconElement(iconURL));
}

function runTests() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        if (testRunner.dumpIconChanges)
            testRunner.dumpIconChanges();
    }

    iconURL = document.getElementsByTagName("head")[0].getElementsByTagName("link")[0].href;
    debugOutput ('Original iconURL is: ' + iconURL);
    newURL = 'http://test.com/newfavicon.ico';
    debugOutput ('Setting new icon URL to: ' + newURL);
    setFavIcon(newURL);
    iconURL = document.getElementsByTagName("head")[0].getElementsByTagName("link")[0].href;

    debugOutput ('New iconURL is: ' + iconURL);

    // check that the URL list in the document is as we expect
    var expectedURLs = "http://test.com/newfavicon.ico";
    var iconURLs = window.internals.shortcutIconURLs();
    if (expectedURLs == iconURLs[0])
        debugOutput('PASS - URL list matches expected');
    else
        debugOutput('FAIL - URL list does not match expected');

    // Add some more fav icons to verify that didChangeIcons gets called.
    var docHead = getHeadElement();
    docHead.insertBefore(createFavIconElement("http://example.org/icon1.ico"), docHead.firstChild);
    docHead.appendChild(createFavIconElement("http://example.org/icon2.ico"));
}

</script>
</head>
<body onload='runTests();'>
<div id='debugDiv'>
</div>
</body>
</html>
