test_data_protocol_registration.js (3574B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 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 var manifests = [do_get_file("data/test_data_protocol_registration.manifest")]; 8 registerManifests(manifests); 9 10 function run_test() { 11 const uuidGenerator = Services.uuid; 12 13 let { newAppInfo } = ChromeUtils.importESModule( 14 "resource://testing-common/AppInfo.sys.mjs" 15 ); 16 let XULAppInfo = newAppInfo({ 17 name: "XPCShell", 18 ID: "{39885e5f-f6b4-4e2a-87e5-6259ecf79011}", 19 version: "5", 20 platformVersion: "1.9", 21 }); 22 23 let XULAppInfoFactory = { 24 // These two are used when we register all our factories (and unregister) 25 CID: uuidGenerator.generateUUID(), 26 scheme: "XULAppInfo", 27 contractID: XULAPPINFO_CONTRACTID, 28 createInstance(iid) { 29 return XULAppInfo.QueryInterface(iid); 30 }, 31 }; 32 33 // Add our XULAppInfo factory 34 let factories = [XULAppInfoFactory]; 35 let old_factories = []; 36 let old_factories_inds = []; 37 38 let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); 39 40 // Register our factories 41 for (let i = 0; i < factories.length; i++) { 42 let factory = factories[i]; 43 44 // Make sure the class ID has not already been registered 45 if (!registrar.isCIDRegistered(factory.CID)) { 46 // Check to see if a contract was already registered and 47 // register it if it is not. Otherwise, store the previous one 48 // to be restored later and register the new one. 49 if (registrar.isContractIDRegistered(factory.contractID)) { 50 dump( 51 factory.scheme + 52 " is already registered. Storing currently registered object for restoration later." 53 ); 54 old_factories.push({ 55 CID: registrar.contractIDToCID(factory.contractID), 56 factory: Components.manager.getClassObject( 57 Cc[factory.contractID], 58 Ci.nsIFactory 59 ), 60 }); 61 old_factories_inds.push(true); 62 } else { 63 dump(factory.scheme + " has never been registered. Registering..."); 64 old_factories.push({ CID: "", factory: null }); 65 old_factories_inds.push(false); 66 } 67 68 registrar.registerFactory( 69 factory.CID, 70 "test-" + factory.scheme, 71 factory.contractID, 72 factory 73 ); 74 } else { 75 do_throw("CID " + factory.CID + " has already been registered!"); 76 } 77 } 78 79 // Check for new chrome 80 let cr = Cc["@mozilla.org/chrome/chrome-registry;1"].getService( 81 Ci.nsIChromeRegistry 82 ); 83 cr.checkForNewChrome(); 84 85 // Check that our override worked 86 let expectedURI = "data:application/xhtml+xml,"; 87 let sourceURI = "chrome://good-package/content/test.xul"; 88 try { 89 sourceURI = Services.io.newURI(sourceURI); 90 // this throws for packages that are not registered 91 let uri = cr.convertChromeURL(sourceURI).spec; 92 93 Assert.equal(expectedURI, uri); 94 } catch (e) { 95 dump(e + "\n"); 96 do_throw("Should have registered our URI!"); 97 } 98 99 // Unregister our factories so we do not leak 100 for (let i = 0; i < factories.length; i++) { 101 let factory = factories[i]; 102 let ind = old_factories_inds[i]; 103 registrar.unregisterFactory(factory.CID, factory); 104 105 if (ind) { 106 let old_factory = old_factories[i]; 107 registrar.registerFactory( 108 old_factory.CID, 109 factory.scheme, 110 factory.contractID, 111 null 112 ); 113 } 114 } 115 }