1 line
33 KiB
Plaintext
1 line
33 KiB
Plaintext
{"version":3,"file":"AccessibilitySystem.mjs","sources":["../../src/accessibility/AccessibilitySystem.ts"],"sourcesContent":["import { FederatedEvent } from '../events/FederatedEvent';\nimport { ExtensionType } from '../extensions/Extensions';\nimport { isMobile } from '../utils/browser/isMobile';\nimport { removeItems } from '../utils/data/removeItems';\nimport { type AccessibleHTMLElement } from './accessibilityTarget';\n\nimport type { Rectangle } from '../maths/shapes/Rectangle';\nimport type { System } from '../rendering/renderers/shared/system/System';\nimport type { Renderer } from '../rendering/renderers/types';\nimport type { Container } from '../scene/container/Container';\nimport type { isMobileResult } from '../utils/browser/isMobile';\n\n/**\n * The accessibility module recreates the ability to tab and have content read by screen readers.\n * This is very important as it can possibly help people with disabilities access PixiJS content.\n *\n * This module is a mixin for {@link AbstractRenderer} and will need to be imported if you are managing your own renderer.\n * Usage:\n * ```js\n * import 'pixi.js/accessibility';\n * ```\n * To make an object accessible do the following:\n * ```js\n * container.accessible = true; // object is now accessible to screen readers!\n * ```\n * See {@link accessibility.AccessibleOptions} for more accessibility related properties that can be set.\n * @namespace accessibility\n */\n\n/** @ignore */\nconst KEY_CODE_TAB = 9;\n\nconst DIV_TOUCH_SIZE = 100;\nconst DIV_TOUCH_POS_X = 0;\nconst DIV_TOUCH_POS_Y = 0;\nconst DIV_TOUCH_ZINDEX = 2;\n\nconst DIV_HOOK_SIZE = 1;\nconst DIV_HOOK_POS_X = -1000;\nconst DIV_HOOK_POS_Y = -1000;\nconst DIV_HOOK_ZINDEX = 2;\n\n/** @ignore */\nexport interface AccessibilityOptions\n{\n /** Setting this to true will visually show the divs. */\n debug?: boolean;\n}\n\n/**\n * The Accessibility system recreates the ability to tab and have content read by screen readers.\n * This is very important as it can possibly help people with disabilities access PixiJS content.\n *\n * A Container can be made accessible just like it can be made interactive. This manager will map the\n * events as if the mouse was being used, minimizing the effort required to implement.\n *\n * An instance of this class is automatically created by default, and can be found at `renderer.accessibility`\n * @memberof accessibility\n */\nexport class AccessibilitySystem implements System<AccessibilityOptions>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ExtensionType.WebGPUSystem,\n ],\n name: 'accessibility',\n } as const;\n\n /** Setting this to true will visually show the divs. */\n public debug = false;\n\n /**\n * The renderer this accessibility manager works for.\n * @type {WebGLRenderer|WebGPURenderer}\n */\n private _renderer: Renderer;\n\n /** Internal variable, see isActive getter. */\n private _isActive = false;\n\n /** Internal variable, see isMobileAccessibility getter. */\n private _isMobileAccessibility = false;\n\n /** Button element for handling touch hooks. */\n private _hookDiv: HTMLElement | null;\n\n /** This is the dom element that will sit over the PixiJS element. This is where the div overlays will go. */\n private _div: HTMLElement;\n\n /** A simple pool for storing divs. */\n private _pool: AccessibleHTMLElement[] = [];\n\n /** This is a tick used to check if an object is no longer being rendered. */\n private _renderId = 0;\n\n /** The array of currently active accessible items. */\n private _children: Container[] = [];\n\n /** Count to throttle div updates on android devices. */\n private _androidUpdateCount = 0;\n\n /** The frequency to update the div elements. */\n private readonly _androidUpdateFrequency = 500; // 2fps\n\n // eslint-disable-next-line jsdoc/require-param\n /**\n * @param {WebGLRenderer|WebGPURenderer} renderer - A reference to the current renderer\n */\n constructor(renderer: Renderer, private readonly _mobileInfo: isMobileResult = isMobile)\n {\n this._hookDiv = null;\n\n if (_mobileInfo.tablet || _mobileInfo.phone)\n {\n this._createTouchHook();\n }\n\n // first we create a div that will sit over the PixiJS element. This is where the div overlays will go.\n const div = document.createElement('div');\n\n div.style.width = `${DIV_TOUCH_SIZE}px`;\n div.style.height = `${DIV_TOUCH_SIZE}px`;\n div.style.position = 'absolute';\n div.style.top = `${DIV_TOUCH_POS_X}px`;\n div.style.left = `${DIV_TOUCH_POS_Y}px`;\n div.style.zIndex = DIV_TOUCH_ZINDEX.toString();\n\n this._div = div;\n this._renderer = renderer;\n\n /**\n * pre-bind the functions\n * @type {Function}\n * @private\n */\n this._onKeyDown = this._onKeyDown.bind(this);\n\n /**\n * pre-bind the functions\n * @type {Function}\n * @private\n */\n this._onMouseMove = this._onMouseMove.bind(this);\n\n // let listen for tab.. once pressed we can fire up and show the accessibility layer\n globalThis.addEventListener('keydown', this._onKeyDown, false);\n }\n\n /**\n * Value of `true` if accessibility is currently active and accessibility layers are showing.\n * @member {boolean}\n * @readonly\n */\n get isActive(): boolean\n {\n return this._isActive;\n }\n\n /**\n * Value of `true` if accessibility is enabled for touch devices.\n * @member {boolean}\n * @readonly\n */\n get isMobileAccessibility(): boolean\n {\n return this._isMobileAccessibility;\n }\n\n get hookDiv()\n {\n return this._hookDiv;\n }\n\n /**\n * Creates the touch hooks.\n * @private\n */\n private _createTouchHook(): void\n {\n const hookDiv = document.createElement('button');\n\n hookDiv.style.width = `${DIV_HOOK_SIZE}px`;\n hookDiv.style.height = `${DIV_HOOK_SIZE}px`;\n hookDiv.style.position = 'absolute';\n hookDiv.style.top = `${DIV_HOOK_POS_X}px`;\n hookDiv.style.left = `${DIV_HOOK_POS_Y}px`;\n hookDiv.style.zIndex = DIV_HOOK_ZINDEX.toString();\n hookDiv.style.backgroundColor = '#FF0000';\n hookDiv.title = 'select to enable accessibility for this content';\n\n hookDiv.addEventListener('focus', () =>\n {\n this._isMobileAccessibility = true;\n this._activate();\n this._destroyTouchHook();\n });\n\n document.body.appendChild(hookDiv);\n this._hookDiv = hookDiv;\n }\n\n /**\n * Destroys the touch hooks.\n * @private\n */\n private _destroyTouchHook(): void\n {\n if (!this._hookDiv)\n {\n return;\n }\n document.body.removeChild(this._hookDiv);\n this._hookDiv = null;\n }\n\n /**\n * Activating will cause the Accessibility layer to be shown.\n * This is called when a user presses the tab key.\n * @private\n */\n private _activate(): void\n {\n if (this._isActive)\n {\n return;\n }\n\n this._isActive = true;\n\n globalThis.document.addEventListener('mousemove', this._onMouseMove, true);\n globalThis.removeEventListener('keydown', this._onKeyDown, false);\n\n this._renderer.runners.postrender.add(this);\n this._renderer.view.canvas.parentNode?.appendChild(this._div);\n }\n\n /**\n * Deactivating will cause the Accessibility layer to be hidden.\n * This is called when a user moves the mouse.\n * @private\n */\n private _deactivate(): void\n {\n if (!this._isActive || this._isMobileAccessibility)\n {\n return;\n }\n\n this._isActive = false;\n\n globalThis.document.removeEventListener('mousemove', this._onMouseMove, true);\n globalThis.addEventListener('keydown', this._onKeyDown, false);\n\n this._renderer.runners.postrender.remove(this);\n this._div.parentNode?.removeChild(this._div);\n }\n\n /**\n * This recursive function will run through the scene graph and add any new accessible objects to the DOM layer.\n * @private\n * @param {Container} container - The Container to check.\n */\n private _updateAccessibleObjects(container: Container): void\n {\n if (!container.visible || !container.accessibleChildren)\n {\n return;\n }\n\n if (container.accessible && container.isInteractive())\n {\n if (!container._accessibleActive)\n {\n this._addChild(container);\n }\n\n container._renderId = this._renderId;\n }\n\n const children = container.children;\n\n if (children)\n {\n for (let i = 0; i < children.length; i++)\n {\n this._updateAccessibleObjects(children[i] as Container);\n }\n }\n }\n\n /**\n * Runner init called, view is available at this point.\n * @ignore\n */\n public init(options?: AccessibilityOptions)\n {\n this.debug = options?.debug ?? this.debug;\n this._renderer.runners.postrender.remove(this);\n }\n\n /**\n * Runner postrender was called, ensure that all divs are mapped correctly to their Containers.\n * Only fires while active.\n * @ignore\n */\n public postrender(): void\n {\n /* On Android default web browser, tab order seems to be calculated by position rather than tabIndex,\n * moving buttons can cause focus to flicker between two buttons making it hard/impossible to navigate,\n * so I am just running update every half a second, seems to fix it.\n */\n const now = performance.now();\n\n if (this._mobileInfo.android.device && now < this._androidUpdateCount)\n {\n return;\n }\n\n this._androidUpdateCount = now + this._androidUpdateFrequency;\n\n if (!this._renderer.renderingToScreen || !this._renderer.view.canvas)\n {\n return;\n }\n\n // update children...\n if (this._renderer.lastObjectRendered)\n {\n this._updateAccessibleObjects(this._renderer.lastObjectRendered as Container);\n }\n\n const { x, y, width, height } = this._renderer.view.canvas.getBoundingClientRect();\n const { width: viewWidth, height: viewHeight, resolution } = this._renderer;\n\n const sx = (width / viewWidth) * resolution;\n const sy = (height / viewHeight) * resolution;\n\n let div = this._div;\n\n div.style.left = `${x}px`;\n div.style.top = `${y}px`;\n div.style.width = `${viewWidth}px`;\n div.style.height = `${viewHeight}px`;\n\n for (let i = 0; i < this._children.length; i++)\n {\n const child = this._children[i];\n\n if (child._renderId !== this._renderId)\n {\n child._accessibleActive = false;\n\n removeItems(this._children, i, 1);\n this._div.removeChild(child._accessibleDiv);\n this._pool.push(child._accessibleDiv);\n child._accessibleDiv = null;\n\n i--;\n }\n else\n {\n // map div to display..\n div = child._accessibleDiv;\n let hitArea = child.hitArea as Rectangle;\n const wt = child.worldTransform;\n\n if (child.hitArea)\n {\n div.style.left = `${(wt.tx + (hitArea.x * wt.a)) * sx}px`;\n div.style.top = `${(wt.ty + (hitArea.y * wt.d)) * sy}px`;\n\n div.style.width = `${hitArea.width * wt.a * sx}px`;\n div.style.height = `${hitArea.height * wt.d * sy}px`;\n }\n else\n {\n hitArea = child.getBounds().rectangle;\n\n this._capHitArea(hitArea);\n\n div.style.left = `${hitArea.x * sx}px`;\n div.style.top = `${hitArea.y * sy}px`;\n\n div.style.width = `${hitArea.width * sx}px`;\n div.style.height = `${hitArea.height * sy}px`;\n\n // update button titles and hints if they exist and they've changed\n if (div.title !== child.accessibleTitle && child.accessibleTitle !== null)\n {\n div.title = child.accessibleTitle || '';\n }\n if (div.getAttribute('aria-label') !== child.accessibleHint\n && child.accessibleHint !== null)\n {\n div.setAttribute('aria-label', child.accessibleHint || '');\n }\n }\n\n // the title or index may have changed, if so lets update it!\n if (child.accessibleTitle !== div.title || child.tabIndex !== div.tabIndex)\n {\n div.title = child.accessibleTitle || '';\n div.tabIndex = child.tabIndex;\n if (this.debug)\n {\n this._updateDebugHTML(div);\n }\n }\n }\n }\n\n // increment the render id..\n this._renderId++;\n }\n\n /**\n * private function that will visually add the information to the\n * accessibility div\n * @param {HTMLElement} div -\n */\n private _updateDebugHTML(div: AccessibleHTMLElement): void\n {\n div.innerHTML = `type: ${div.type}</br> title : ${div.title}</br> tabIndex: ${div.tabIndex}`;\n }\n\n /**\n * Adjust the hit area based on the bounds of a display object\n * @param {Rectangle} hitArea - Bounds of the child\n */\n private _capHitArea(hitArea: Rectangle): void\n {\n if (hitArea.x < 0)\n {\n hitArea.width += hitArea.x;\n hitArea.x = 0;\n }\n\n if (hitArea.y < 0)\n {\n hitArea.height += hitArea.y;\n hitArea.y = 0;\n }\n\n const { width: viewWidth, height: viewHeight } = this._renderer;\n\n if (hitArea.x + hitArea.width > viewWidth)\n {\n hitArea.width = viewWidth - hitArea.x;\n }\n\n if (hitArea.y + hitArea.height > viewHeight)\n {\n hitArea.height = viewHeight - hitArea.y;\n }\n }\n\n /**\n * Adds a Container to the accessibility manager\n * @private\n * @param {Container} container - The child to make accessible.\n */\n private _addChild<T extends Container>(container: T): void\n {\n // this.activate();\n\n let div = this._pool.pop();\n\n if (!div)\n {\n div = document.createElement('button');\n\n div.style.width = `${DIV_TOUCH_SIZE}px`;\n div.style.height = `${DIV_TOUCH_SIZE}px`;\n div.style.backgroundColor = this.debug ? 'rgba(255,255,255,0.5)' : 'transparent';\n div.style.position = 'absolute';\n div.style.zIndex = DIV_TOUCH_ZINDEX.toString();\n div.style.borderStyle = 'none';\n\n // ARIA attributes ensure that button title and hint updates are announced properly\n if (navigator.userAgent.toLowerCase().includes('chrome'))\n {\n // Chrome doesn't need aria-live to work as intended; in fact it just gets more confused.\n div.setAttribute('aria-live', 'off');\n }\n else\n {\n div.setAttribute('aria-live', 'polite');\n }\n\n if (navigator.userAgent.match(/rv:.*Gecko\\//))\n {\n // FireFox needs this to announce only the new button name\n div.setAttribute('aria-relevant', 'additions');\n }\n else\n {\n // required by IE, other browsers don't much care\n div.setAttribute('aria-relevant', 'text');\n }\n\n div.addEventListener('click', this._onClick.bind(this));\n div.addEventListener('focus', this._onFocus.bind(this));\n div.addEventListener('focusout', this._onFocusOut.bind(this));\n }\n\n // set pointer events\n div.style.pointerEvents = container.accessiblePointerEvents;\n // set the type, this defaults to button!\n div.type = container.accessibleType;\n\n if (container.accessibleTitle && container.accessibleTitle !== null)\n {\n div.title = container.accessibleTitle;\n }\n else if (!container.accessibleHint\n || container.accessibleHint === null)\n {\n div.title = `container ${container.tabIndex}`;\n }\n\n if (container.accessibleHint\n && container.accessibleHint !== null)\n {\n div.setAttribute('aria-label', container.accessibleHint);\n }\n\n if (this.debug)\n {\n this._updateDebugHTML(div);\n }\n\n container._accessibleActive = true;\n container._accessibleDiv = div;\n div.container = container;\n\n this._children.push(container);\n this._div.appendChild(container._accessibleDiv);\n container._accessibleDiv.tabIndex = container.tabIndex;\n }\n\n /**\n * Dispatch events with the EventSystem.\n * @param e\n * @param type\n * @private\n */\n private _dispatchEvent(e: UIEvent, type: string[]): void\n {\n const { container: target } = e.target as AccessibleHTMLElement;\n const boundary = this._renderer.events.rootBoundary;\n const event: FederatedEvent = Object.assign(new FederatedEvent(boundary), { target });\n\n boundary.rootTarget = this._renderer.lastObjectRendered as Container;\n type.forEach((type) => boundary.dispatchEvent(event, type));\n }\n\n /**\n * Maps the div button press to pixi's EventSystem (click)\n * @private\n * @param {MouseEvent} e - The click event.\n */\n private _onClick(e: MouseEvent): void\n {\n this._dispatchEvent(e, ['click', 'pointertap', 'tap']);\n }\n\n /**\n * Maps the div focus events to pixi's EventSystem (mouseover)\n * @private\n * @param {FocusEvent} e - The focus event.\n */\n private _onFocus(e: FocusEvent): void\n {\n if (!(e.target as Element).getAttribute('aria-live'))\n {\n (e.target as Element).setAttribute('aria-live', 'assertive');\n }\n\n this._dispatchEvent(e, ['mouseover']);\n }\n\n /**\n * Maps the div focus events to pixi's EventSystem (mouseout)\n * @private\n * @param {FocusEvent} e - The focusout event.\n */\n private _onFocusOut(e: FocusEvent): void\n {\n if (!(e.target as Element).getAttribute('aria-live'))\n {\n (e.target as Element).setAttribute('aria-live', 'polite');\n }\n\n this._dispatchEvent(e, ['mouseout']);\n }\n\n /**\n * Is called when a key is pressed\n * @private\n * @param {KeyboardEvent} e - The keydown event.\n */\n private _onKeyDown(e: KeyboardEvent): void\n {\n if (e.keyCode !== KEY_CODE_TAB)\n {\n return;\n }\n\n this._activate();\n }\n\n /**\n * Is called when the mouse moves across the renderer element\n * @private\n * @param {MouseEvent} e - The mouse event.\n */\n private _onMouseMove(e: MouseEvent): void\n {\n if (e.movementX === 0 && e.movementY === 0)\n {\n return;\n }\n\n this._deactivate();\n }\n\n /** Destroys the accessibility manager */\n public destroy(): void\n {\n this._destroyTouchHook();\n this._div = null;\n\n globalThis.document.removeEventListener('mousemove', this._onMouseMove, true);\n globalThis.removeEventListener('keydown', this._onKeyDown);\n\n this._pool = null;\n this._children = null;\n this._renderer = null;\n }\n}\n"],"names":["type"],"mappings":"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"} |