/** * Common infrastructure for manifest tests. **/ "use strict"; const { ManifestProcessor } = SpecialPowers.ChromeUtils.importESModule( "resource://gre/modules/ManifestProcessor.sys.mjs" ); const processor = ManifestProcessor; const manifestURL = new URL(document.location.origin + "/manifest.json"); const docURL = document.location; const seperators = "\u2028\u2029\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000"; const lineTerminators = "\u000D\u000A\u2028\u2029"; const whiteSpace = `${seperators}${lineTerminators}`; const typeTests = [1, null, {}, [], false]; const data = { jsonText: "{}", manifestURL, docURL, }; const validThemeColors = [ ["maroon", "#800000ff"], ["#f00", "#ff0000ff"], ["#ff0000", "#ff0000ff"], ["rgb(255,0,0)", "#ff0000ff"], ["rgb(255,0,0,1)", "#ff0000ff"], ["rgb(255,0,0,1.0)", "#ff0000ff"], ["rgb(255,0,0,100%)", "#ff0000ff"], ["rgb(255 0 0)", "#ff0000ff"], ["rgb(255 0 0 / 1)", "#ff0000ff"], ["rgb(255 0 0 / 1.0)", "#ff0000ff"], ["rgb(255 0 0 / 100%)", "#ff0000ff"], ["rgb(100%, 0%, 0%)", "#ff0000ff"], ["rgb(100%, 0%, 0%, 1)", "#ff0000ff"], ["rgb(100%, 0%, 0%, 1.0)", "#ff0000ff"], ["rgb(100%, 0%, 0%, 100%)", "#ff0000ff"], ["rgb(100% 0% 0%)", "#ff0000ff"], ["rgb(100% 0% 0% / 1)", "#ff0000ff"], ["rgb(100%, 0%, 0%, 1.0)", "#ff0000ff"], ["rgb(100%, 0%, 0%, 100%)", "#ff0000ff"], ["rgb(300,0,0)", "#ff0000ff"], ["rgb(300 0 0)", "#ff0000ff"], ["rgb(255,-10,0)", "#ff0000ff"], ["rgb(110%, 0%, 0%)", "#ff0000ff"], ["rgba(255,0,0)", "#ff0000ff"], ["rgba(255,0,0,1)", "#ff0000ff"], ["rgba(255 0 0 / 1)", "#ff0000ff"], ["rgba(100%,0%,0%,1)", "#ff0000ff"], ["rgba(0,0,255,0.5)", "#0000ff80"], ["rgba(100%, 50%, 0%, 0.1)", "#ff80001a"], ["hsl(120, 100%, 50%)", "#00ff00ff"], ["hsl(120 100% 50%)", "#00ff00ff"], ["hsl(120, 100%, 50%, 1.0)", "#00ff00ff"], ["hsl(120 100% 50% / 1.0)", "#00ff00ff"], ["hsla(120, 100%, 50%)", "#00ff00ff"], ["hsla(120 100% 50%)", "#00ff00ff"], ["hsla(120, 100%, 50%, 1.0)", "#00ff00ff"], ["hsla(120 100% 50% / 1.0)", "#00ff00ff"], ["hsl(120deg, 100%, 50%)", "#00ff00ff"], ["hsl(133.33333333grad, 100%, 50%)", "#00ff00ff"], ["hsl(2.0943951024rad, 100%, 50%)", "#00ff00ff"], ["hsl(0.3333333333turn, 100%, 50%)", "#00ff00ff"], ]; function setupManifest(key, value) { const manifest = {}; manifest[key] = value; data.jsonText = JSON.stringify(manifest); } function testValidColors(key) { validThemeColors.forEach(item => { const [manifest_color, parsed_color] = item; setupManifest(key, manifest_color); const result = processor.process(data); is( result[key], parsed_color, `Expect ${key} to be returned for ${manifest_color}` ); }); // Trim tests validThemeColors.forEach(item => { const [manifest_color, parsed_color] = item; const expandedThemeColor = `${seperators}${lineTerminators}${manifest_color}${lineTerminators}${seperators}`; setupManifest(key, expandedThemeColor); const result = processor.process(data); is( result[key], parsed_color, `Expect trimmed ${key} to be returned for ${manifest_color}` ); }); } const invalidThemeColors = [ "marooon", "f000000", "#ff00000", "rgb(100, 0%, 0%)", "rgb(255,0)", "rbg(255,-10,0)", "rgb(110, 0%, 0%)", "(255,0,0) }", "rgba(255)", " rgb(100%,0%,0%) }", "hsl(120, 100%, 50)", "hsl(120, 100%, 50.0)", "hsl 120, 100%, 50%", "hsla{120, 100%, 50%, 1}", ]; function testInvalidColors(key) { typeTests.forEach(type => { setupManifest(key, type); const result = processor.process(data); is( result[key], undefined, `Expect non-string ${key} to be undefined: ${typeof type}.` ); }); invalidThemeColors.forEach(manifest_color => { setupManifest(key, manifest_color); const result = processor.process(data); is( result[key], undefined, `Expect ${key} to be undefined: ${manifest_color}.` ); }); }