<html>
<body>
<p>Tests source origin difference for cached resources.</p
<p>This succeeds if not crashing after applying memory pressure (https://bugs.webkit.org/show_bug.cgi?id=163887).</p>
<div id="console"></div>
<div>
    <iframe id="iframe1"></iframe>
    <iframe id="iframe2"></iframe>
</div>
<script>
if (window.testRunner) {
   testRunner.dumpAsText();
   testRunner.waitUntilDone();
}

window.addEventListener("message", function(event) {
    document.getElementById('console').innerHTML += event.data + "<br/>";
    loadNextFrame();
});

var iframeURL8000 = "http://localhost:8000/security/resources/cross-origin-cached-resource-iframe.html";
var iframeURL8080 = "http://localhost:8080/security/resources/cross-origin-cached-resource-iframe.html";

var allowAllImage1 = "data:image/svg+xml;base64, " +
        "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRw" +
        "Oi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIg" +
        "aGVpZ2h0PSIxMDAlIiBmaWxsPSJMaWdodFNlYUdyZWVuIi8+PHJlY3QgeD0iMjAiIHk9IjIwIiB3" +
        "aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJyZWQiLz48aW1hZ2UgeD0iMjAiIHk9IjIw" +
        "IiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4" +
        "bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5" +
        "emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUncNCk9pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwz" +
        "aHNhVzVySWo0OGNtVmpkQ0I0UFNJd0lpQjVQU0l3SWlCM2FXUjBhRDBpTVRBd0pTSWcNCmFHVnBa" +
        "MmgwUFNJeE1EQWxJaUJtYVd4c1BTSm5jbVZsYmlJdlBqeHlaV04wSUhnOUlqSXdJaUI1UFNJeU1D" +
        "SWdkMmxrZEdnOUlqRXcNCk1DVWlJR2hsYVdkb2REMGlNVEF3SlNJZ1ptbHNiRDBpY21Wa0lpOCtQ" +
        "R2x0WVdkbElIZzlJakl3SWlCNVBTSXlNQ0lnZDJsa2RHZzkNCklqRXdNQ1VpSUdobGFXZG9kRDBp" +
        "TVRBd0pTSWdlR3hwYm1zNmFISmxaajBpWkdGMFlUcHBiV0ZuWlM5emRtY3JlRzFzTzJKaGMyVTIN" +
        "Ck5DeFFTRTR5V25sQ05HSlhlSFZqZWpCcFlVaFNNR05FYjNaTU0yUXpaSGsxTTAxNU5YWmpiV04y" +
        "VFdwQmQwMURPWHBrYldOcFNVaG8NCmRHSkhOWHBQYm1oellWYzFjbEJUU205a1NGSjNEUXBQYVRo" +
        "MlpETmtNMHh1WTNwTWJUbDVXbms0ZUU5VWF6Vk1NMmh6WVZjMWNrbHENCk5EaGpiVlpxWkVOQ05G" +
        "QlRTWGRKYVVJMVVGTkpkMGxwUWpOaFYxSXdZVVF3YVUxVVFYZEtVMGxuRFFwaFIxWndXakpvTUZC" +
        "VFNYaE4NClJFRnNTV2xDYldGWGVITlFVMHB6WVZka2IyUkZaSGxhVjFaMVNXazRLMUJJU214Wk0x" +
        "Rm5aVVF3YVUxcVFXbEpTR3M1U1dwSmQwbHANClFqTmhWMUl3RFFwaFJEQnBUVlJCZDBwVFNXZGhS" +
        "MVp3V2pKb01GQlRTWGhOUkVGc1NXbENiV0ZYZUhOUVUwcDVXbGRSYVV4Nk5EaGgNClZ6Rm9XakpW" +
        "WjJWRU1HbE5ha0ZwU1Vock9VbHFTWGRKYVVJekRRcGhWMUl3WVVRd2FVMVVRWGRLVTBsbllVZFdj" +
        "Rm95YURCUVUwbDQNClRVUkJiRWxwUWpSaVIyeDFZWHB3YjJOdFZtMVFVMHByV1ZoU2FFOXRiSFJa" +
        "VjJSc1RETk9NbHA1ZERSaVYzYzNEUXBaYlVaNldsUloNCk1FeEdRa2xVYWtwaFpWVkpNRmxzWkRS" +
        "a1YwNDJUVWRzYUZOR1NYZFpNRkoyWkd0M2VscEVUbXRsVkZWNlZGaHJNV1J0VG5SWk0xcE8NCllX" +
        "dEdNMVJWVFRWbGJWSjBEUXBaTW14S1UwZG9NRmxyWXpGbGF6bDFZVWhPYUZaNlZubFZSazVMWWpK" +
        "U1NWVnVZMDVEYXpsd1QwaGENCmEwMHlVWHBVUnpWcVpXdDRkRTlZYkdGbFZHZzBWREZTY2s1VmQz" +
        "cGhTRTVvRFFwV2VsWjVVMWR2TUU5SFRuUldiWEJyVVRCSk1GVkcNClRrcGtNR3h3VVdwV1VWVXdi" +
        "RE5UVjJ4RFRUSkdXRlZxUW1oU1JFSndWRlpTUW1Rd2NGUlRWMk5PUTIxR1NGWnVRbUZOYldkM0RR" +
        "cFYNClJrNUtaVVV4UlZGWGVFcGhWVXAwV1Zaa05HTXhRbFJUYms1b1ZucEdjMVZxVGt0aVJuQllU" +
        "a2RzVFdWcVVUUlpNakZYWVcxU1JGRnENClVsRlZNR3cxVkZWT1Nsb3lWbFZOUjJ4T0RRcGhhMFp3" +
        "VTFWb2EyTkdjRWxWYlRoT1EyeENWRk5ZYUU1U1JVWnpVMWRzUTJJeGNGaGkNClJ6Vm9VMFpGTlZO" +
        "WGNFWmtNREZFVmxkc1NsSXhjSGRaYTJRelQxVnNkVk50ZUdGUk1Hd3lEUXBWUjNBMFkwZEtXRkp0" +
        "TldGVk1Fa3cNClZVWk9TbVZWTVVSVFYyUnNWa1JDY0ZSWGNFSmhWV3hKV2toQlRrTnNjRWxWYlRs" +
        "UlZUQnNORlJWVWtKaVJXeHdVVzA1WVZZeWVIVloNClZXaFNEUXBQVld4eFVsaGtUbEV4Vm5CVFZX" +
        "aHZZekpHV0U1WVNsQmlWMmcxVjJ4a1drOVZiSFJWYldoclVqQlZNbGxXWTNoaFJtOTUNClZsaGFh" +
        "bEo2Vm5WVWVrcExZVWROZVZaVVNVNURhelZFRFFwbFNFSlhZVEJ3VVZaWE5XcGtNVTEzV2tjMWFV" +
        "MUZXa05WVmxaSFZERlYNCmVGWnRPVk5XYkZwMVZWWldSMUZzU1hoU2EwcFNWbFZhUkZsVVFrOVJi" +
        "R1JXVW10S1VsWlZiM3BVYTJoRERRcFdNVnBXVW10S1VsWlYNCldrTldNRlV4VmtaV2NWRnJiMDVE" +
        "YkVaWlUyNXdUMUl3TUhsV1ZsWkhVV3hHVm1SRmRGUmlSWEJIVlcxNFYySkdVblZUYWtKT1VtdGEN" +
        "ClIxWkhkRWRSYkVaV0RRcGlSRTVQVFVVMVJsZHRjRzVPVm05NVdYcEdVbUY2YTNwWmEyaEhXVlph" +
        "Um1GR1VtbFhSa3AxVlZSQ2MySnMNClJsWlNiRTFPUTJ4S1ZsUnJTbEpOUlZwNVZsZDBSMkpzUmxo" +
        "aVJYQmhEUXBOUlZwRFZsZDBWMUpHUmxaVWEwcG9UVlZ3UTFkcVFrZGoNClJrNVlXa1ZLVWxacmNF" +
        "ZFZWRUpIVWtaR1dHUkdUbEpXTWxKRFdWWldjMkpzUmxaU2JFNVRWbFUxUTFWVVFrZGpiRlp5RFFw" +
        "U2JUUk8NClEyeEdXR0pGY0dGTlJWcERWbGQwVjFKR1JsWlVhMHBvVFZWd1ExZHFRa2RqUms1WVdr" +
        "VktVbFpyY0VkVlZFSkhVa1pHV0dSR1RsSlcNCk1sSkRXVlpXYzJKc1JsWlNiRTVURFFwV1ZUVkRW" +
        "VlJDUjJOc1ZuSlNiVFZTVmpKNFMxZHFRa2RSYkZaeVZtdFJUa05zUmxaVWEwcG8NClRWVndRMWRx" +
        "UWtkalJrNVlXa1ZLVWxacmNFZFZWRUpIVWtaR1dHUkdUbEpXTWxKRERRcFpWbFp6WW14R1ZsSnNU" +
        "bE5XVlRWRFZWUkMNClIyTnNWbkpTYlRWU1ZqSlNTMVZzVmtkU2JGWnlWbXRTVWxaVk5VTlpWRVpM" +
        "VVcxU2RWTnRNRTVEYlU1elZXeEtWVkpYVW05Vk1GSlANCkRRcGxSbXh5VW10S1VsWlZXa05WVjNS" +
        "M1ZURmFWVlpyV21waVdGSk1WMnBLYTJKc1FsVk5SMnhSWVc1a01sbFdZM2hoUm05NVZsTjANClVW" +
        "RjZiRFphUnpGcVN6QlNVbUl3TlVSYWVqQTVEUXBKYWpRNFRESnNkRmxYWkd4UWFuZDJZek5hYmxC" +
        "blBUMGlQand2YVcxaFoyVSsNClBDOXpkbWMrIj48L2ltYWdlPjwvc3ZnPg==";

var counter = 0;
function loadNextFrame()
{
    counter++;
    // Four first tests try to load an image with a given origin and then the same image (in cache) with a different origin.
    if (counter == 1)
        document.getElementById('iframe1').src = iframeURL8000 + "#" +
            encodeURIComponent(JSON.stringify({node: "img", url: allowAllImage1, shouldPass:true, crossOrigin: "anonymous", id: 1}));
    else if (counter == 2)
        document.getElementById('iframe2').src = iframeURL8080 + "#" +
            encodeURIComponent(JSON.stringify({node: "img", url: allowAllImage1, shouldPass: true, crossOrigin: "anonymous", id: 2}));
    else
        endTest();
}

function endTest()
{
    // Removing iframe2 and applying memory pressure should kick in SVG CachedImage clearing of observer
    document.getElementById('iframe2').src = "";
    setTimeout(function() {
        if (window.internals) {
            internals.beginSimulatedMemoryPressure();
            internals.endSimulatedMemoryPressure();
        }
        document.getElementById('console').innerHTML += "PASS applying memory pressure";
        if (window.testRunner)
            testRunner.notifyDone();
    });
}

loadNextFrame();
</script>
</body>
</html>
