|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
|
2 * vim: sw=2 ts=2 sts=2 tw=78 expandtab : |
|
3 * This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 let manifests = [ |
|
8 do_get_file("data/test_no_remote_registration.manifest"), |
|
9 ]; |
|
10 registerManifests(manifests); |
|
11 |
|
12 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
13 |
|
14 let XULAppInfo = { |
|
15 vendor: "Mozilla", |
|
16 name: "XPCShell", |
|
17 ID: "{39885e5f-f6b4-4e2a-87e5-6259ecf79011}", |
|
18 version: "5", |
|
19 appBuildID: "2007010101", |
|
20 platformVersion: "1.9", |
|
21 platformBuildID: "2007010101", |
|
22 inSafeMode: false, |
|
23 logConsoleErrors: true, |
|
24 OS: "XPCShell", |
|
25 XPCOMABI: "noarch-spidermonkey", |
|
26 QueryInterface: XPCOMUtils.generateQI([ |
|
27 Ci.nsIXULAppInfo, |
|
28 Ci.nsIXULRuntime, |
|
29 ]) |
|
30 }; |
|
31 |
|
32 let XULAppInfoFactory = { |
|
33 // These two are used when we register all our factories (and unregister) |
|
34 CID: XULAPPINFO_CID, |
|
35 scheme: "XULAppInfo", |
|
36 contractID: XULAPPINFO_CONTRACTID, |
|
37 createInstance: function (outer, iid) { |
|
38 if (outer != null) |
|
39 throw Cr.NS_ERROR_NO_AGGREGATION; |
|
40 return XULAppInfo.QueryInterface(iid); |
|
41 } |
|
42 }; |
|
43 |
|
44 function ProtocolHandler(aScheme, aFlags) |
|
45 { |
|
46 this.scheme = aScheme; |
|
47 this.protocolFlags = aFlags; |
|
48 this.contractID = "@mozilla.org/network/protocol;1?name=" + aScheme; |
|
49 } |
|
50 |
|
51 ProtocolHandler.prototype = |
|
52 { |
|
53 defaultPort: -1, |
|
54 allowPort: function() false, |
|
55 newURI: function(aSpec, aCharset, aBaseURI) |
|
56 { |
|
57 let uri = Cc["@mozilla.org/network/standard-url;1"]. |
|
58 createInstance(Ci.nsIURI); |
|
59 uri.spec = aSpec; |
|
60 if (!uri.scheme) { |
|
61 // We got a partial uri, so let's resolve it with the base one |
|
62 uri.spec = aBaseURI.resolve(aSpec); |
|
63 } |
|
64 return uri; |
|
65 }, |
|
66 newChannel: function() { throw Cr.NS_ERROR_NOT_IMPLEMENTED }, |
|
67 QueryInterface: XPCOMUtils.generateQI([ |
|
68 Ci.nsIProtocolHandler |
|
69 ]) |
|
70 }; |
|
71 |
|
72 let testProtocols = [ |
|
73 // It doesn't matter if it has this flag - the only flag we accept is |
|
74 // URI_IS_LOCAL_RESOURCE. |
|
75 {scheme: "moz-protocol-ui-resource", |
|
76 flags: Ci.nsIProtocolHandler.URI_IS_UI_RESOURCE, |
|
77 CID: Components.ID("{d6dedc93-558f-44fe-90f4-3b4bba8a0b14}"), |
|
78 shouldRegister: false |
|
79 }, |
|
80 // It doesn't matter if it has this flag - the only flag we accept is |
|
81 // URI_IS_LOCAL_RESOURCE. |
|
82 {scheme: "moz-protocol-local-file", |
|
83 flags: Ci.nsIProtocolHandler.URI_IS_LOCAL_FILE, |
|
84 CID: Components.ID("{ee30d594-0a2d-4f47-89cc-d4cde320ab69}"), |
|
85 shouldRegister: false |
|
86 }, |
|
87 // This clearly is non-local |
|
88 {scheme: "moz-protocol-loadable-by-anyone", |
|
89 flags: Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE, |
|
90 CID: Components.ID("{c3735f23-3b0c-4a33-bfa0-79436dcd40b2}"), |
|
91 shouldRegister: false |
|
92 }, |
|
93 // This should always be last (unless we add more flags that are OK) |
|
94 {scheme: "moz-protocol-local-resource", |
|
95 flags: Ci.nsIProtocolHandler.URI_IS_LOCAL_RESOURCE, |
|
96 CID: Components.ID("{b79e977c-f840-469a-b413-0125cc1b62a5}"), |
|
97 shouldRegister: true |
|
98 }, |
|
99 ]; |
|
100 function run_test() |
|
101 { |
|
102 // Create factories |
|
103 let factories = []; |
|
104 for (let i = 0; i < testProtocols.length; i++) { |
|
105 factories[i] = { |
|
106 scheme: testProtocols[i].scheme, |
|
107 flags: testProtocols[i].flags, |
|
108 CID: testProtocols[i].CID, |
|
109 contractID: "@mozilla.org/network/protocol;1?name=" + testProtocols[i].scheme, |
|
110 createInstance: function(aOuter, aIID) |
|
111 { |
|
112 if (aOuter != null) |
|
113 throw Cr.NS_ERROR_NO_AGGREGATION; |
|
114 let handler = new ProtocolHandler(this.scheme, this.flags, this.CID); |
|
115 return handler.QueryInterface(aIID); |
|
116 } |
|
117 }; |
|
118 } |
|
119 // Add our XULAppInfo factory |
|
120 factories.push(XULAppInfoFactory); |
|
121 |
|
122 // Register our factories |
|
123 for (let i = 0; i < factories.length; i++) { |
|
124 let factory = factories[i]; |
|
125 Components.manager.QueryInterface(Ci.nsIComponentRegistrar) |
|
126 .registerFactory(factory.CID, "test-" + factory.scheme, |
|
127 factory.contractID, factory); |
|
128 } |
|
129 |
|
130 // Check for new chrome |
|
131 let cr = Cc["@mozilla.org/chrome/chrome-registry;1"]. |
|
132 getService(Ci.nsIChromeRegistry); |
|
133 cr.checkForNewChrome(); |
|
134 |
|
135 // See if our various things were able to register |
|
136 let registrationTypes = [ |
|
137 "content", |
|
138 "locale", |
|
139 "skin", |
|
140 "override", |
|
141 "resource", |
|
142 ]; |
|
143 for (let i = 0; i < testProtocols.length; i++) { |
|
144 let protocol = testProtocols[i]; |
|
145 for (let j = 0; j < registrationTypes.length; j++) { |
|
146 let type = registrationTypes[j]; |
|
147 dump("Testing protocol '" + protocol.scheme + "' with type '" + type + |
|
148 "'\n"); |
|
149 let expectedURI = protocol.scheme + "://foo/"; |
|
150 let sourceURI = "chrome://" + protocol.scheme + "/" + type + "/"; |
|
151 switch (type) { |
|
152 case "content": |
|
153 expectedURI += protocol.scheme + ".xul"; |
|
154 break; |
|
155 case "locale": |
|
156 expectedURI += protocol.scheme + ".dtd"; |
|
157 break; |
|
158 case "skin": |
|
159 expectedURI += protocol.scheme + ".css"; |
|
160 break; |
|
161 case "override": |
|
162 sourceURI = "chrome://good-package/content/override-" + |
|
163 protocol.scheme + ".xul"; |
|
164 break; |
|
165 case "resource": |
|
166 sourceURI = "resource://" + protocol.scheme + "/"; |
|
167 break; |
|
168 }; |
|
169 try { |
|
170 let ios = Cc["@mozilla.org/network/io-service;1"]. |
|
171 getService(Ci.nsIIOService); |
|
172 sourceURI = ios.newURI(sourceURI, null, null); |
|
173 let uri; |
|
174 if (type == "resource") { |
|
175 // resources go about a slightly different way than everything else |
|
176 let rph = ios.getProtocolHandler("resource"). |
|
177 QueryInterface(Ci.nsIResProtocolHandler); |
|
178 // this throws for packages that are not registered |
|
179 uri = rph.resolveURI(sourceURI); |
|
180 } |
|
181 else { |
|
182 // this throws for packages that are not registered |
|
183 uri = cr.convertChromeURL(sourceURI).spec; |
|
184 } |
|
185 |
|
186 if (protocol.shouldRegister) { |
|
187 do_check_eq(expectedURI, uri); |
|
188 } |
|
189 else { |
|
190 // Overrides will not throw, so we'll get to here. We want to make |
|
191 // sure that the two strings are not the same in this situation. |
|
192 do_check_neq(expectedURI, uri); |
|
193 } |
|
194 } |
|
195 catch (e) { |
|
196 if (protocol.shouldRegister) { |
|
197 dump(e + "\n"); |
|
198 do_throw("Should have registered our URI for protocol " + |
|
199 protocol.scheme); |
|
200 } |
|
201 } |
|
202 } |
|
203 } |
|
204 |
|
205 // Unregister our factories so we do not leak |
|
206 for (let i = 0; i < factories.length; i++) { |
|
207 let factory = factories[i]; |
|
208 Components.manager.QueryInterface(Ci.nsIComponentRegistrar) |
|
209 .unregisterFactory(factory.CID, factory); |
|
210 } |
|
211 } |