getRole.js.map
11.8 KB
{"version":3,"sources":["../sources/getRole.ts"],"names":["getLocalName","element","localName","tagName","toLowerCase","localNameToRoleMappings","article","aside","button","datalist","dd","details","dialog","dt","fieldset","figure","form","footer","h1","h2","h3","h4","h5","h6","header","hr","html","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","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\n/**\n * Safe Element.localName for all supported environments\n * @param element\n */\nexport function getLocalName(element: Element): string {\n\treturn (\n\t\t// eslint-disable-next-line no-restricted-properties -- actual guard for environments without localName\n\t\telement.localName ??\n\t\t// eslint-disable-next-line no-restricted-properties -- required for the fallback\n\t\telement.tagName.toLowerCase()\n\t);\n}\n\nconst localNameToRoleMappings: Record<string, string | undefined> = {\n\tarticle: \"article\",\n\taside: \"complementary\",\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\thtml: \"document\",\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\tcase \"number\":\n\t\t\t\t\treturn \"spinbutton\";\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\tconst role = element.getAttribute(\"role\");\n\tif (role !== null) {\n\t\tconst explicitRole = role.trim().split(\" \")[0];\n\t\t// String.prototype.split(sep, limit) will always return an array with at least one member\n\t\t// as long as limit is either undefined or > 0\n\t\tif (explicitRole.length > 0) {\n\t\t\treturn explicitRole;\n\t\t}\n\t}\n\n\treturn null;\n}\n"],"file":"getRole.js"}