diff options
Diffstat (limited to 'browser/base/content/test/general/browser_discovery.js')
-rw-r--r-- | browser/base/content/test/general/browser_discovery.js | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_discovery.js b/browser/base/content/test/general/browser_discovery.js new file mode 100644 index 000000000..23d44c6a9 --- /dev/null +++ b/browser/base/content/test/general/browser_discovery.js @@ -0,0 +1,162 @@ +var browser; + +function doc() { + return browser.contentDocument; +} + +function setHandlerFunc(aResultFunc) { + gBrowser.addEventListener("DOMLinkAdded", function (event) { + gBrowser.removeEventListener("DOMLinkAdded", arguments.callee, false); + executeSoon(aResultFunc); + }, false); +} + +function test() { + waitForExplicitFinish(); + + gBrowser.selectedTab = gBrowser.addTab(); + browser = gBrowser.selectedBrowser; + browser.addEventListener("load", function (event) { + event.currentTarget.removeEventListener("load", arguments.callee, true); + iconDiscovery(); + }, true); + var rootDir = getRootDirectory(gTestPath); + content.location = rootDir + "discovery.html"; +} + +var iconDiscoveryTests = [ + { text: "rel icon discovered" }, + { rel: "abcdefg icon qwerty", text: "rel may contain additional rels separated by spaces" }, + { rel: "ICON", text: "rel is case insensitive" }, + { rel: "shortcut-icon", pass: false, text: "rel shortcut-icon not discovered" }, + { href: "moz.png", text: "relative href works" }, + { href: "notthere.png", text: "404'd icon is removed properly" }, + { href: "data:image/x-icon,%00", type: "image/x-icon", text: "data: URIs work" }, + { type: "image/png; charset=utf-8", text: "type may have optional parameters (RFC2046)" } +]; + +function runIconDiscoveryTest() { + var testCase = iconDiscoveryTests[0]; + var head = doc().getElementById("linkparent"); + var hasSrc = gBrowser.getIcon() != null; + if (testCase.pass) + ok(hasSrc, testCase.text); + else + ok(!hasSrc, testCase.text); + + head.removeChild(head.getElementsByTagName('link')[0]); + iconDiscoveryTests.shift(); + iconDiscovery(); // Run the next test. +} + +function iconDiscovery() { + if (iconDiscoveryTests.length) { + setHandlerFunc(runIconDiscoveryTest); + gBrowser.setIcon(gBrowser.selectedTab, null, + Services.scriptSecurityManager.getSystemPrincipal()); + + var testCase = iconDiscoveryTests[0]; + var head = doc().getElementById("linkparent"); + var link = doc().createElement("link"); + + var rootDir = getRootDirectory(gTestPath); + var rel = testCase.rel || "icon"; + var href = testCase.href || rootDir + "moz.png"; + var type = testCase.type || "image/png"; + if (testCase.pass == undefined) + testCase.pass = true; + + link.rel = rel; + link.href = href; + link.type = type; + head.appendChild(link); + } else { + searchDiscovery(); + } +} + +var searchDiscoveryTests = [ + { text: "rel search discovered" }, + { rel: "SEARCH", text: "rel is case insensitive" }, + { rel: "-search-", pass: false, text: "rel -search- not discovered" }, + { rel: "foo bar baz search quux", text: "rel may contain additional rels separated by spaces" }, + { href: "https://not.mozilla.com", text: "HTTPS ok" }, + { href: "ftp://not.mozilla.com", text: "FTP ok" }, + { href: "data:text/foo,foo", pass: false, text: "data URI not permitted" }, + { href: "javascript:alert(0)", pass: false, text: "JS URI not permitted" }, + { type: "APPLICATION/OPENSEARCHDESCRIPTION+XML", text: "type is case insensitve" }, + { type: " application/opensearchdescription+xml ", text: "type may contain extra whitespace" }, + { type: "application/opensearchdescription+xml; charset=utf-8", text: "type may have optional parameters (RFC2046)" }, + { type: "aapplication/opensearchdescription+xml", pass: false, text: "type should not be loosely matched" }, + { rel: "search search search", count: 1, text: "only one engine should be added" } +]; + +function runSearchDiscoveryTest() { + var testCase = searchDiscoveryTests[0]; + var title = testCase.title || searchDiscoveryTests.length; + if (browser.engines) { + var hasEngine = (testCase.count) ? (browser.engines[0].title == title && + browser.engines.length == testCase.count) : + (browser.engines[0].title == title); + ok(hasEngine, testCase.text); + browser.engines = null; + } + else + ok(!testCase.pass, testCase.text); + + searchDiscoveryTests.shift(); + searchDiscovery(); // Run the next test. +} + +// This handler is called twice, once for each added link element. +// Only want to check once the second link element has been added. +var ranOnce = false; +function runMultipleEnginesTestAndFinalize() { + if (!ranOnce) { + ranOnce = true; + return; + } + ok(browser.engines, "has engines"); + is(browser.engines.length, 1, "only one engine"); + is(browser.engines[0].uri, "http://first.mozilla.com/search.xml", "first engine wins"); + + gBrowser.removeCurrentTab(); + finish(); +} + +function searchDiscovery() { + let head = doc().getElementById("linkparent"); + + if (searchDiscoveryTests.length) { + setHandlerFunc(runSearchDiscoveryTest); + let testCase = searchDiscoveryTests[0]; + let link = doc().createElement("link"); + + let rel = testCase.rel || "search"; + let href = testCase.href || "http://so.not.here.mozilla.com/search.xml"; + let type = testCase.type || "application/opensearchdescription+xml"; + let title = testCase.title || searchDiscoveryTests.length; + if (testCase.pass == undefined) + testCase.pass = true; + + link.rel = rel; + link.href = href; + link.type = type; + link.title = title; + head.appendChild(link); + } else { + setHandlerFunc(runMultipleEnginesTestAndFinalize); + setHandlerFunc(runMultipleEnginesTestAndFinalize); + // Test multiple engines with the same title + let link = doc().createElement("link"); + link.rel = "search"; + link.href = "http://first.mozilla.com/search.xml"; + link.type = "application/opensearchdescription+xml"; + link.title = "Test Engine"; + let link2 = link.cloneNode(false); + link2.href = "http://second.mozilla.com/search.xml"; + + head.appendChild(link); + head.appendChild(link2); + } +} |