diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_registerchrome.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_registerchrome.js | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_registerchrome.js b/toolkit/mozapps/extensions/test/xpcshell/test_registerchrome.js new file mode 100644 index 0000000000..5d45a1a273 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_registerchrome.js @@ -0,0 +1,88 @@ +"use strict"; + +function getFileURI(path) { + let file = do_get_file("."); + file.append(path); + return Services.io.newFileURI(file); +} + +add_task(async function () { + const registry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService( + Ci.nsIChromeRegistry + ); + + let file1 = getFileURI("file1"); + let file2 = getFileURI("file2"); + + let uri1 = getFileURI("chrome.manifest"); + let uri2 = getFileURI("manifest.json"); + + let overrideURL = Services.io.newURI("chrome://global/content/foo"); + let contentURL = Services.io.newURI("chrome://test/content/foo"); + let localeURL = Services.io.newURI("chrome://global/locale/foo"); + + let origOverrideURL = registry.convertChromeURL(overrideURL); + let origLocaleURL = registry.convertChromeURL(localeURL); + + let entry1 = aomStartup.registerChrome(uri1, [ + ["override", "chrome://global/content/foo", file1.spec], + ["content", "test", file2.spec + "/"], + ["locale", "global", "en-US", file2.spec + "/"], + ]); + + let entry2 = aomStartup.registerChrome(uri2, [ + ["override", "chrome://global/content/foo", file2.spec], + ["content", "test", file1.spec + "/"], + ["locale", "global", "en-US", file1.spec + "/"], + ]); + + // Initially, the second entry should override the first. + equal(registry.convertChromeURL(overrideURL).spec, file2.spec); + let file = file1.spec + "/foo"; + equal(registry.convertChromeURL(contentURL).spec, file); + equal(registry.convertChromeURL(localeURL).spec, file); + + // After destroying the second entry, the first entry should now take + // precedence. + entry2.destruct(); + equal(registry.convertChromeURL(overrideURL).spec, file1.spec); + file = file2.spec + "/foo"; + equal(registry.convertChromeURL(contentURL).spec, file); + equal(registry.convertChromeURL(localeURL).spec, file); + + // After dropping the reference to the first entry and allowing it to + // be GCed, we should be back to the original entries. + entry1 = null; // eslint-disable-line no-unused-vars + Cu.forceGC(); + Cu.forceCC(); + equal(registry.convertChromeURL(overrideURL).spec, origOverrideURL.spec); + equal(registry.convertChromeURL(localeURL).spec, origLocaleURL.spec); + Assert.throws( + () => registry.convertChromeURL(contentURL), + e => e.result == Cr.NS_ERROR_FILE_NOT_FOUND, + "chrome://test/ should no longer be registered" + ); +}); + +add_task(async function () { + const INVALID_VALUES = [ + {}, + "foo", + ["foo"], + [{}], + [[]], + [["locale", "global"]], + [["locale", "global", "en", "foo", "foo"]], + [["override", "en"]], + [["override", "en", "US", "OR"]], + ]; + + let uri = getFileURI("chrome.manifest"); + for (let arg of INVALID_VALUES) { + Assert.throws( + () => aomStartup.registerChrome(uri, arg), + e => e.result == Cr.NS_ERROR_INVALID_ARG, + `Arg ${uneval(arg)} should throw` + ); + } +}); |