Sha256: 207a4460ea9453fbd62b8244bd2e6c62234c725c69f7e16fb3a252d9032f5e04

Contents?: true

Size: 1.83 KB

Versions: 375

Compression:

Stored size: 1.83 KB

Contents

/* global aria, dom, text */

/**
 * Get the accessible name based on aria-labelledby
 *
 * @param {VirtualNode} element
 * @param {Object} context
 * @property {Bool} inLabelledByContext Whether or not the lookup is part of aria-labelledby reference
 * @property {Bool} inControlContext Whether or not the lookup is part of a native label reference
 * @property {Element} startNode First node in accessible name computation
 * @property {Bool} debug Enable logging for formControlValue
 * @return {string} Cancatinated text value for referenced elements
 */
aria.arialabelledbyText = function arialabelledbyText(node, context = {}) {
	node = node.actualNode || node;
	/**
	 * Note: The there are significant difference in how many "leads" browsers follow.
	 * - Firefox stops after the first IDREF, so it
	 * 		doesn't follow aria-labelledby after a for:>ID ref.
	 * - Chrome seems to just keep iterating no matter how many levels deep.
	 * - AccName-AAM 1.1 suggests going one level deep, but to treat
	 * 		each ref type separately.
	 *
	 * Axe-core's implementation behaves most closely like Firefox as it seems
	 *  to be the common denominator. Main difference is that Firefox
	 *  includes the value of form controls in addition to aria-label(s),
	 *  something no other browser seems to do. Axe doesn't do that.
	 */
	if (
		node.nodeType !== 1 ||
		context.inLabelledByContext ||
		context.inControlContext
	) {
		return '';
	}

	const refs = dom.idrefs(node, 'aria-labelledby').filter(elm => elm);
	return refs.reduce((accessibleName, elm) => {
		const accessibleNameAdd = text.accessibleText(elm, {
			// Prevent the infinite reference loop:
			inLabelledByContext: true,
			startNode: context.startNode || node,
			...context
		});

		if (!accessibleName) {
			return accessibleNameAdd;
		} else {
			return `${accessibleName} ${accessibleNameAdd}`;
		}
	}, '');
};

Version data entries

375 entries across 375 versions & 1 rubygems

Version Path
govuk_publishing_components-30.4.1 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.4.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.3.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.2.1 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.2.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.1.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-30.0.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.15.3 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.15.2 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.15.1 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.15.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.14.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.13.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.12.1 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.12.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.11.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.10.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.9.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.8.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js
govuk_publishing_components-29.7.0 node_modules/axe-core/lib/commons/aria/arialabelledby-text.js