<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin" type="text/css"?> <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> <window title="Bug 1277803 test" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" width="600" height="600" onload="runTest();"> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> <body xmlns="http://www.w3.org/1999/xhtml"> </body> <script type="application/javascript"><![CDATA[ SimpleTest.requestCompleteLog(); let Ci = Components.interfaces; let Cc = Components.classes; let Cu = Components.utils; let makeURI = Cu.import("resource://gre/modules/BrowserUtils.jsm", {}).BrowserUtils.makeURI; const BASE_URI = "http://mochi.test:8888/chrome/dom/security/test/general/"; const FAVICON_URI = BASE_URI + "favicon_bug1277803.ico"; const LOADING_URI = BASE_URI + "bug1277803.html"; let testWindow; //will be used to trigger favicon load let securityManager = Cc["@mozilla.org/scriptsecuritymanager;1"]. getService(Ci.nsIScriptSecurityManager); let expectedPrincipal = securityManager.createCodebasePrincipal(makeURI(LOADING_URI), {}); let systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].createInstance(); // We expect 2 favicon loads, one from PlacesUIUtils.loadFavicon and one // from XUL:image loads. let requestXUL = false; let requestPlaces = false; function runTest() { // Register our observer to intercept favicon requests. let os = Cc["@mozilla.org/observer-service;1"]. getService(Ci.nsIObserverService); let observer = { observe: function(aSubject, aTopic, aData) { // Make sure this is a favicon request. let httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel); if (FAVICON_URI != httpChannel.URI.spec) { return; } // Ensure the topic is the one we set an observer for. is(aTopic, "http-on-modify-request", "Expected observer topic"); // Check for the correct loadingPrincipal, triggeringPrincipal. let triggeringPrincipal = httpChannel.loadInfo.triggeringPrincipal; let loadingPrincipal = httpChannel.loadInfo.loadingPrincipal; if (loadingPrincipal.equals(systemPrincipal)) { // This is the favicon loading from XUL, which will have the system // principal as its loading principal and have a content principal // as its triggering principal. ok(triggeringPrincipal.equals(expectedPrincipal), "Correct triggeringPrincipal for favicon from XUL."); requestXUL = true; } else if (loadingPrincipal.equals(expectedPrincipal)) { // This is the favicon loading from Places, which will have a // content principal as its loading principal and triggering // principal. ok(triggeringPrincipal.equals(expectedPrincipal), "Correct triggeringPrincipal for favicon from Places."); requestPlaces = true; } else { ok(false, "An unexpected favicon request.") } // Cleanup after ourselves... if (requestXUL && requestPlaces) { os.removeObserver(this, "http-on-modify-request"); SimpleTest.finish(); } } } os.addObserver(observer, "http-on-modify-request", false); // Now that the observer is set up, trigger a favicon load with navigation testWindow = window.open(LOADING_URI); } SimpleTest.waitForExplicitFinish(); SimpleTest.registerCleanupFunction(function() { if (testWindow) { testWindow.close(); } }); ]]></script> <browser type="content-primary" flex="1" id="content" src="about:blank"/> </window>