|
1 var browser; |
|
2 |
|
3 function doc() browser.contentDocument; |
|
4 |
|
5 function setHandlerFunc(aResultFunc) { |
|
6 gBrowser.addEventListener("DOMLinkAdded", function (event) { |
|
7 gBrowser.removeEventListener("DOMLinkAdded", arguments.callee, false); |
|
8 executeSoon(aResultFunc); |
|
9 }, false); |
|
10 } |
|
11 |
|
12 function test() { |
|
13 waitForExplicitFinish(); |
|
14 |
|
15 gBrowser.selectedTab = gBrowser.addTab(); |
|
16 browser = gBrowser.selectedBrowser; |
|
17 browser.addEventListener("load", function (event) { |
|
18 event.currentTarget.removeEventListener("load", arguments.callee, true); |
|
19 iconDiscovery(); |
|
20 }, true); |
|
21 var rootDir = getRootDirectory(gTestPath); |
|
22 content.location = rootDir + "discovery.html"; |
|
23 } |
|
24 |
|
25 var iconDiscoveryTests = [ |
|
26 { text: "rel icon discovered" }, |
|
27 { rel: "abcdefg icon qwerty", text: "rel may contain additional rels separated by spaces" }, |
|
28 { rel: "ICON", text: "rel is case insensitive" }, |
|
29 { rel: "shortcut-icon", pass: false, text: "rel shortcut-icon not discovered" }, |
|
30 { href: "moz.png", text: "relative href works" }, |
|
31 { href: "notthere.png", text: "404'd icon is removed properly" }, |
|
32 { href: "data:image/x-icon,%00", type: "image/x-icon", text: "data: URIs work" }, |
|
33 { type: "image/png; charset=utf-8", text: "type may have optional parameters (RFC2046)" } |
|
34 ]; |
|
35 |
|
36 function runIconDiscoveryTest() { |
|
37 var test = iconDiscoveryTests[0]; |
|
38 var head = doc().getElementById("linkparent"); |
|
39 var hasSrc = gBrowser.getIcon() != null; |
|
40 if (test.pass) |
|
41 ok(hasSrc, test.text); |
|
42 else |
|
43 ok(!hasSrc, test.text); |
|
44 |
|
45 head.removeChild(head.getElementsByTagName('link')[0]); |
|
46 iconDiscoveryTests.shift(); |
|
47 iconDiscovery(); // Run the next test. |
|
48 } |
|
49 |
|
50 function iconDiscovery() { |
|
51 if (iconDiscoveryTests.length) { |
|
52 setHandlerFunc(runIconDiscoveryTest); |
|
53 gBrowser.setIcon(gBrowser.selectedTab, null); |
|
54 |
|
55 var test = iconDiscoveryTests[0]; |
|
56 var head = doc().getElementById("linkparent"); |
|
57 var link = doc().createElement("link"); |
|
58 |
|
59 var rootDir = getRootDirectory(gTestPath); |
|
60 var rel = test.rel || "icon"; |
|
61 var href = test.href || rootDir + "moz.png"; |
|
62 var type = test.type || "image/png"; |
|
63 if (test.pass == undefined) |
|
64 test.pass = true; |
|
65 |
|
66 link.rel = rel; |
|
67 link.href = href; |
|
68 link.type = type; |
|
69 head.appendChild(link); |
|
70 } else { |
|
71 searchDiscovery(); |
|
72 } |
|
73 } |
|
74 |
|
75 var searchDiscoveryTests = [ |
|
76 { text: "rel search discovered" }, |
|
77 { rel: "SEARCH", text: "rel is case insensitive" }, |
|
78 { rel: "-search-", pass: false, text: "rel -search- not discovered" }, |
|
79 { rel: "foo bar baz search quux", text: "rel may contain additional rels separated by spaces" }, |
|
80 { href: "https://not.mozilla.com", text: "HTTPS ok" }, |
|
81 { href: "ftp://not.mozilla.com", text: "FTP ok" }, |
|
82 { href: "data:text/foo,foo", pass: false, text: "data URI not permitted" }, |
|
83 { href: "javascript:alert(0)", pass: false, text: "JS URI not permitted" }, |
|
84 { type: "APPLICATION/OPENSEARCHDESCRIPTION+XML", text: "type is case insensitve" }, |
|
85 { type: " application/opensearchdescription+xml ", text: "type may contain extra whitespace" }, |
|
86 { type: "application/opensearchdescription+xml; charset=utf-8", text: "type may have optional parameters (RFC2046)" }, |
|
87 { type: "aapplication/opensearchdescription+xml", pass: false, text: "type should not be loosely matched" }, |
|
88 { rel: "search search search", count: 1, text: "only one engine should be added" } |
|
89 ]; |
|
90 |
|
91 function runSearchDiscoveryTest() { |
|
92 var test = searchDiscoveryTests[0]; |
|
93 var title = test.title || searchDiscoveryTests.length; |
|
94 if (browser.engines) { |
|
95 var hasEngine = (test.count) ? (browser.engines[0].title == title && |
|
96 browser.engines.length == test.count) : |
|
97 (browser.engines[0].title == title); |
|
98 ok(hasEngine, test.text); |
|
99 browser.engines = null; |
|
100 } |
|
101 else |
|
102 ok(!test.pass, test.text); |
|
103 |
|
104 searchDiscoveryTests.shift(); |
|
105 searchDiscovery(); // Run the next test. |
|
106 } |
|
107 |
|
108 // This handler is called twice, once for each added link element. |
|
109 // Only want to check once the second link element has been added. |
|
110 var ranOnce = false; |
|
111 function runMultipleEnginesTestAndFinalize() { |
|
112 if (!ranOnce) { |
|
113 ranOnce = true; |
|
114 return; |
|
115 } |
|
116 ok(browser.engines, "has engines"); |
|
117 is(browser.engines.length, 1, "only one engine"); |
|
118 is(browser.engines[0].uri, "http://first.mozilla.com/search.xml", "first engine wins"); |
|
119 |
|
120 gBrowser.removeCurrentTab(); |
|
121 finish(); |
|
122 } |
|
123 |
|
124 function searchDiscovery() { |
|
125 var head = doc().getElementById("linkparent"); |
|
126 |
|
127 if (searchDiscoveryTests.length) { |
|
128 setHandlerFunc(runSearchDiscoveryTest); |
|
129 var test = searchDiscoveryTests[0]; |
|
130 var link = doc().createElement("link"); |
|
131 |
|
132 var rel = test.rel || "search"; |
|
133 var href = test.href || "http://so.not.here.mozilla.com/search.xml"; |
|
134 var type = test.type || "application/opensearchdescription+xml"; |
|
135 var title = test.title || searchDiscoveryTests.length; |
|
136 if (test.pass == undefined) |
|
137 test.pass = true; |
|
138 |
|
139 link.rel = rel; |
|
140 link.href = href; |
|
141 link.type = type; |
|
142 link.title = title; |
|
143 head.appendChild(link); |
|
144 } else { |
|
145 setHandlerFunc(runMultipleEnginesTestAndFinalize); |
|
146 setHandlerFunc(runMultipleEnginesTestAndFinalize); |
|
147 // Test multiple engines with the same title |
|
148 var link = doc().createElement("link"); |
|
149 link.rel = "search"; |
|
150 link.href = "http://first.mozilla.com/search.xml"; |
|
151 link.type = "application/opensearchdescription+xml"; |
|
152 link.title = "Test Engine"; |
|
153 var link2 = link.cloneNode(false); |
|
154 link2.href = "http://second.mozilla.com/search.xml"; |
|
155 |
|
156 head.appendChild(link); |
|
157 head.appendChild(link2); |
|
158 } |
|
159 } |