getRole.js.map 11 KB
{"version":3,"sources":["../sources/getRole.ts"],"names":["localNameToRoleMappings","article","aside","body","button","datalist","dd","details","dialog","dt","fieldset","figure","form","footer","h1","h2","h3","h4","h5","h6","header","hr","legend","li","math","main","menu","nav","ol","optgroup","option","output","progress","section","summary","table","tbody","textarea","tfoot","td","th","thead","tr","ul","prohibitedAttributes","caption","Set","code","deletion","emphasis","generic","insertion","paragraph","presentation","strong","subscript","superscript","hasGlobalAriaAttributes","element","role","some","attributeName","hasAttribute","has","ignorePresentationalRole","implicitRole","getRole","explicitRole","getExplicitRole","getImplicitRole","mappedByTag","undefined","getAttribute","type","size","trim","split","length"],"mappings":"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","sourcesContent":["// https://w3c.github.io/html-aria/#document-conformance-requirements-for-use-of-aria-attributes-in-html\n\nimport { getLocalName } from \"./util\";\n\nconst localNameToRoleMappings: Record<string, string | undefined> = {\n\tarticle: \"article\",\n\taside: \"complementary\",\n\tbody: \"document\",\n\tbutton: \"button\",\n\tdatalist: \"listbox\",\n\tdd: \"definition\",\n\tdetails: \"group\",\n\tdialog: \"dialog\",\n\tdt: \"term\",\n\tfieldset: \"group\",\n\tfigure: \"figure\",\n\t// WARNING: Only with an accessible name\n\tform: \"form\",\n\tfooter: \"contentinfo\",\n\th1: \"heading\",\n\th2: \"heading\",\n\th3: \"heading\",\n\th4: \"heading\",\n\th5: \"heading\",\n\th6: \"heading\",\n\theader: \"banner\",\n\thr: \"separator\",\n\tlegend: \"legend\",\n\tli: \"listitem\",\n\tmath: \"math\",\n\tmain: \"main\",\n\tmenu: \"list\",\n\tnav: \"navigation\",\n\tol: \"list\",\n\toptgroup: \"group\",\n\t// WARNING: Only in certain context\n\toption: \"option\",\n\toutput: \"status\",\n\tprogress: \"progressbar\",\n\t// WARNING: Only with an accessible name\n\tsection: \"region\",\n\tsummary: \"button\",\n\ttable: \"table\",\n\ttbody: \"rowgroup\",\n\ttextarea: \"textbox\",\n\ttfoot: \"rowgroup\",\n\t// WARNING: Only in certain context\n\ttd: \"cell\",\n\tth: \"columnheader\",\n\tthead: \"rowgroup\",\n\ttr: \"row\",\n\tul: \"list\",\n};\n\nconst prohibitedAttributes: Record<string, Set<string>> = {\n\tcaption: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tcode: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tdeletion: new Set([\"aria-label\", \"aria-labelledby\"]),\n\temphasis: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tgeneric: new Set([\"aria-label\", \"aria-labelledby\", \"aria-roledescription\"]),\n\tinsertion: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tparagraph: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tpresentation: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tstrong: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tsubscript: new Set([\"aria-label\", \"aria-labelledby\"]),\n\tsuperscript: new Set([\"aria-label\", \"aria-labelledby\"]),\n};\n\n/**\n *\n * @param element\n * @param role The role used for this element. This is specified to control whether you want to use the implicit or explicit role.\n */\nfunction hasGlobalAriaAttributes(element: Element, role: string): boolean {\n\t// https://rawgit.com/w3c/aria/stable/#global_states\n\t// commented attributes are deprecated\n\treturn [\n\t\t\"aria-atomic\",\n\t\t\"aria-busy\",\n\t\t\"aria-controls\",\n\t\t\"aria-current\",\n\t\t\"aria-describedby\",\n\t\t\"aria-details\",\n\t\t// \"disabled\",\n\t\t\"aria-dropeffect\",\n\t\t// \"errormessage\",\n\t\t\"aria-flowto\",\n\t\t\"aria-grabbed\",\n\t\t// \"haspopup\",\n\t\t\"aria-hidden\",\n\t\t// \"invalid\",\n\t\t\"aria-keyshortcuts\",\n\t\t\"aria-label\",\n\t\t\"aria-labelledby\",\n\t\t\"aria-live\",\n\t\t\"aria-owns\",\n\t\t\"aria-relevant\",\n\t\t\"aria-roledescription\",\n\t].some((attributeName) => {\n\t\treturn (\n\t\t\telement.hasAttribute(attributeName) &&\n\t\t\t!prohibitedAttributes[role]?.has(attributeName)\n\t\t);\n\t});\n}\n\nfunction ignorePresentationalRole(\n\telement: Element,\n\timplicitRole: string\n): boolean {\n\t// https://rawgit.com/w3c/aria/stable/#conflict_resolution_presentation_none\n\treturn hasGlobalAriaAttributes(element, implicitRole);\n}\n\nexport default function getRole(element: Element): string | null {\n\tconst explicitRole = getExplicitRole(element);\n\tif (explicitRole === null || explicitRole === \"presentation\") {\n\t\tconst implicitRole = getImplicitRole(element);\n\t\tif (\n\t\t\texplicitRole !== \"presentation\" ||\n\t\t\tignorePresentationalRole(element, implicitRole || \"\")\n\t\t) {\n\t\t\treturn implicitRole;\n\t\t}\n\t}\n\n\treturn explicitRole;\n}\n\nfunction getImplicitRole(element: Element): string | null {\n\tconst mappedByTag = localNameToRoleMappings[getLocalName(element)];\n\tif (mappedByTag !== undefined) {\n\t\treturn mappedByTag;\n\t}\n\n\tswitch (getLocalName(element)) {\n\t\tcase \"a\":\n\t\tcase \"area\":\n\t\tcase \"link\":\n\t\t\tif (element.hasAttribute(\"href\")) {\n\t\t\t\treturn \"link\";\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"img\":\n\t\t\tif (\n\t\t\t\telement.getAttribute(\"alt\") === \"\" &&\n\t\t\t\t!ignorePresentationalRole(element, \"img\")\n\t\t\t) {\n\t\t\t\treturn \"presentation\";\n\t\t\t}\n\t\t\treturn \"img\";\n\t\tcase \"input\": {\n\t\t\tconst { type } = element as HTMLInputElement;\n\t\t\tswitch (type) {\n\t\t\t\tcase \"button\":\n\t\t\t\tcase \"image\":\n\t\t\t\tcase \"reset\":\n\t\t\t\tcase \"submit\":\n\t\t\t\t\treturn \"button\";\n\t\t\t\tcase \"checkbox\":\n\t\t\t\tcase \"radio\":\n\t\t\t\t\treturn type;\n\t\t\t\tcase \"range\":\n\t\t\t\t\treturn \"slider\";\n\t\t\t\tcase \"email\":\n\t\t\t\tcase \"tel\":\n\t\t\t\tcase \"text\":\n\t\t\t\tcase \"url\":\n\t\t\t\t\tif (element.hasAttribute(\"list\")) {\n\t\t\t\t\t\treturn \"combobox\";\n\t\t\t\t\t}\n\t\t\t\t\treturn \"textbox\";\n\n\t\t\t\tcase \"search\":\n\t\t\t\t\tif (element.hasAttribute(\"list\")) {\n\t\t\t\t\t\treturn \"combobox\";\n\t\t\t\t\t}\n\t\t\t\t\treturn \"searchbox\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tcase \"select\":\n\t\t\tif (\n\t\t\t\telement.hasAttribute(\"multiple\") ||\n\t\t\t\t(element as HTMLSelectElement).size > 1\n\t\t\t) {\n\t\t\t\treturn \"listbox\";\n\t\t\t}\n\t\t\treturn \"combobox\";\n\t}\n\treturn null;\n}\n\nfunction getExplicitRole(element: Element): string | null {\n\tif (element.hasAttribute(\"role\")) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- safe due to hasAttribute check\n\t\tconst [explicitRole] = element.getAttribute(\"role\")!.trim().split(\" \");\n\t\tif (explicitRole !== undefined && explicitRole.length > 0) {\n\t\t\treturn explicitRole;\n\t\t}\n\t}\n\n\treturn null;\n}\n"],"file":"getRole.js"}