blob: 8dc33eab3556b930f335a513975c4e5c6a40591d [file] [log] [blame]
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as ARIAProperties from '../../generated/ARIAProperties.js';
export interface AttributeConfig {
name: string;
type: string;
enum?: string[];
}
export interface RoleConfig {
name: string;
}
export interface Config {
attributes: AttributeConfig[];
roles: RoleConfig[];
}
export class ARIAMetadata {
private readonly attributes: Map<string, Attribute>;
private roleNames: string[];
constructor(config: Config|null) {
this.attributes = new Map();
this.roleNames = [];
if (config) {
this.initialize(config);
}
}
private initialize(config: Config): void {
const attributes = config['attributes'];
const booleanEnum = ['true', 'false'];
for (const attributeConfig of attributes) {
if (attributeConfig.type === 'boolean') {
attributeConfig.enum = booleanEnum;
}
this.attributes.set(attributeConfig.name, new Attribute(attributeConfig));
}
this.roleNames = config['roles'].map(roleConfig => roleConfig.name);
}
valuesForProperty(property: string): string[] {
const attribute = this.attributes.get(property);
if (attribute) {
return attribute.getEnum();
}
if (property === 'role') {
return this.roleNames;
}
return [];
}
}
let instance: ARIAMetadata|undefined;
export function ariaMetadata(): ARIAMetadata {
if (!instance) {
instance = new ARIAMetadata(ARIAProperties.config as Config || null);
}
return instance;
}
export class Attribute {
private readonly enum: string[];
constructor(config: AttributeConfig) {
this.enum = [];
if (config.enum) {
this.enum = config.enum;
}
}
getEnum(): string[] {
return this.enum;
}
}