chore: align SerializedAXNode with rpc protocol AXNode (#3522)
This commit is contained in:
parent
97157520a6
commit
63a2c673b5
|
|
@ -203,20 +203,15 @@ class CRAXNode implements accessibility.AXNode {
|
||||||
const properties: Map<string, number | string | boolean> = new Map();
|
const properties: Map<string, number | string | boolean> = new Map();
|
||||||
for (const property of this._payload.properties || [])
|
for (const property of this._payload.properties || [])
|
||||||
properties.set(property.name.toLowerCase(), property.value.value);
|
properties.set(property.name.toLowerCase(), property.value.value);
|
||||||
if (this._payload.name)
|
|
||||||
properties.set('name', this._payload.name.value);
|
|
||||||
if (this._payload.value)
|
|
||||||
properties.set('value', this._payload.value.value);
|
|
||||||
if (this._payload.description)
|
if (this._payload.description)
|
||||||
properties.set('description', this._payload.description.value);
|
properties.set('description', this._payload.description.value);
|
||||||
|
|
||||||
const node: {[x in keyof types.SerializedAXNode]: any} = {
|
const node: {[x in keyof types.SerializedAXNode]: any} = {
|
||||||
role: this._role,
|
role: this._role,
|
||||||
name: this._payload.name ? (this._payload.name.value || '') : ''
|
name: this._payload.name ? (this._payload.name.value || '') : '',
|
||||||
};
|
};
|
||||||
|
|
||||||
const userStringProperties: Array<keyof types.SerializedAXNode> = [
|
const userStringProperties: Array<keyof types.SerializedAXNode> = [
|
||||||
'value',
|
|
||||||
'description',
|
'description',
|
||||||
'keyshortcuts',
|
'keyshortcuts',
|
||||||
'roledescription',
|
'roledescription',
|
||||||
|
|
@ -227,7 +222,6 @@ class CRAXNode implements accessibility.AXNode {
|
||||||
continue;
|
continue;
|
||||||
node[userStringProperty] = properties.get(userStringProperty);
|
node[userStringProperty] = properties.get(userStringProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
const booleanProperties: Array<keyof types.SerializedAXNode> = [
|
const booleanProperties: Array<keyof types.SerializedAXNode> = [
|
||||||
'disabled',
|
'disabled',
|
||||||
'expanded',
|
'expanded',
|
||||||
|
|
@ -249,17 +243,6 @@ class CRAXNode implements accessibility.AXNode {
|
||||||
continue;
|
continue;
|
||||||
node[booleanProperty] = value;
|
node[booleanProperty] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tristateProperties: Array<keyof types.SerializedAXNode> = [
|
|
||||||
'checked',
|
|
||||||
'pressed',
|
|
||||||
];
|
|
||||||
for (const tristateProperty of tristateProperties) {
|
|
||||||
if (!properties.has(tristateProperty))
|
|
||||||
continue;
|
|
||||||
const value = properties.get(tristateProperty);
|
|
||||||
node[tristateProperty] = value === 'mixed' ? 'mixed' : value === 'true' ? true : false;
|
|
||||||
}
|
|
||||||
const numericalProperties: Array<keyof types.SerializedAXNode> = [
|
const numericalProperties: Array<keyof types.SerializedAXNode> = [
|
||||||
'level',
|
'level',
|
||||||
'valuemax',
|
'valuemax',
|
||||||
|
|
@ -282,7 +265,19 @@ class CRAXNode implements accessibility.AXNode {
|
||||||
continue;
|
continue;
|
||||||
node[tokenProperty] = value;
|
node[tokenProperty] = value;
|
||||||
}
|
}
|
||||||
return node as types.SerializedAXNode;
|
|
||||||
|
const axNode = node as types.SerializedAXNode;
|
||||||
|
if (this._payload.value) {
|
||||||
|
if (typeof this._payload.value.value === 'string')
|
||||||
|
axNode.valueString = this._payload.value.value;
|
||||||
|
if (typeof this._payload.value.value === 'number')
|
||||||
|
axNode.valueNumber = this._payload.value.value;
|
||||||
|
}
|
||||||
|
if (properties.has('checked'))
|
||||||
|
axNode.checked = properties.get('checked') === 'true' ? 'checked' : properties.get('checked') === 'false' ? 'unchecked' : 'mixed';
|
||||||
|
if (properties.has('pressed'))
|
||||||
|
axNode.pressed = properties.get('pressed') === 'true' ? 'pressed' : properties.get('pressed') === 'false' ? 'released' : 'mixed';
|
||||||
|
return axNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static createTree(client: CRSession, payloads: Protocol.Accessibility.AXNode[]): CRAXNode {
|
static createTree(client: CRSession, payloads: Protocol.Accessibility.AXNode[]): CRAXNode {
|
||||||
|
|
|
||||||
|
|
@ -202,11 +202,10 @@ class FFAXNode implements accessibility.AXNode {
|
||||||
serialize(): types.SerializedAXNode {
|
serialize(): types.SerializedAXNode {
|
||||||
const node: {[x in keyof types.SerializedAXNode]: any} = {
|
const node: {[x in keyof types.SerializedAXNode]: any} = {
|
||||||
role: FFRoleToARIARole.get(this._role) || this._role,
|
role: FFRoleToARIARole.get(this._role) || this._role,
|
||||||
name: this._name || ''
|
name: this._name || '',
|
||||||
};
|
};
|
||||||
const userStringProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
|
const userStringProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
|
||||||
'name',
|
'name',
|
||||||
'value',
|
|
||||||
'description',
|
'description',
|
||||||
'roledescription',
|
'roledescription',
|
||||||
'valuetext',
|
'valuetext',
|
||||||
|
|
@ -236,16 +235,6 @@ class FFAXNode implements accessibility.AXNode {
|
||||||
continue;
|
continue;
|
||||||
node[booleanProperty] = value;
|
node[booleanProperty] = value;
|
||||||
}
|
}
|
||||||
const tristateProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
|
|
||||||
'checked',
|
|
||||||
'pressed',
|
|
||||||
];
|
|
||||||
for (const tristateProperty of tristateProperties) {
|
|
||||||
if (!(tristateProperty in this._payload))
|
|
||||||
continue;
|
|
||||||
const value = this._payload[tristateProperty];
|
|
||||||
node[tristateProperty] = value;
|
|
||||||
}
|
|
||||||
const numericalProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
|
const numericalProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
|
||||||
'level'
|
'level'
|
||||||
];
|
];
|
||||||
|
|
@ -266,6 +255,13 @@ class FFAXNode implements accessibility.AXNode {
|
||||||
continue;
|
continue;
|
||||||
node[tokenProperty] = value;
|
node[tokenProperty] = value;
|
||||||
}
|
}
|
||||||
return node;
|
|
||||||
|
const axNode = node as types.SerializedAXNode;
|
||||||
|
axNode.valueString = this._payload.value;
|
||||||
|
if ('checked' in this._payload)
|
||||||
|
axNode.checked = this._payload.checked === true ? 'checked' : this._payload.checked === 'mixed' ? 'mixed' : 'unchecked';
|
||||||
|
if ('pressed' in this._payload)
|
||||||
|
axNode.pressed = this._payload.pressed === true ? 'pressed' : 'released';
|
||||||
|
return axNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import { Frame } from '../../frames';
|
||||||
import { Request } from '../../network';
|
import { Request } from '../../network';
|
||||||
import { Page, Worker } from '../../page';
|
import { Page, Worker } from '../../page';
|
||||||
import * as types from '../../types';
|
import * as types from '../../types';
|
||||||
import { BindingCallChannel, BindingCallInitializer, ElementHandleChannel, PageChannel, PageInitializer, ResponseChannel, WorkerInitializer, WorkerChannel, JSHandleChannel, Binary, SerializedArgument, PagePdfParams, SerializedError, PageAccessibilitySnapshotResult, SerializedValue, PageEmulateMediaParams, AXNode } from '../channels';
|
import { BindingCallChannel, BindingCallInitializer, ElementHandleChannel, PageChannel, PageInitializer, ResponseChannel, WorkerInitializer, WorkerChannel, JSHandleChannel, Binary, SerializedArgument, PagePdfParams, SerializedError, PageAccessibilitySnapshotResult, SerializedValue, PageEmulateMediaParams } from '../channels';
|
||||||
import { Dispatcher, DispatcherScope, lookupDispatcher, lookupNullableDispatcher } from './dispatcher';
|
import { Dispatcher, DispatcherScope, lookupDispatcher, lookupNullableDispatcher } from './dispatcher';
|
||||||
import { parseError, serializeError } from '../serializers';
|
import { parseError, serializeError } from '../serializers';
|
||||||
import { ConsoleMessageDispatcher } from './consoleMessageDispatcher';
|
import { ConsoleMessageDispatcher } from './consoleMessageDispatcher';
|
||||||
|
|
@ -184,7 +184,7 @@ export class PageDispatcher extends Dispatcher<Page, PageInitializer> implements
|
||||||
interestingOnly: params.interestingOnly,
|
interestingOnly: params.interestingOnly,
|
||||||
root: params.root ? (params.root as ElementHandleDispatcher)._elementHandle : undefined
|
root: params.root ? (params.root as ElementHandleDispatcher)._elementHandle : undefined
|
||||||
});
|
});
|
||||||
return { rootAXNode: rootAXNode ? axNodeToProtocol(rootAXNode) : undefined };
|
return { rootAXNode: rootAXNode || undefined };
|
||||||
}
|
}
|
||||||
|
|
||||||
async pdf(params: PagePdfParams): Promise<{ pdf: Binary }> {
|
async pdf(params: PagePdfParams): Promise<{ pdf: Binary }> {
|
||||||
|
|
@ -274,16 +274,3 @@ export class BindingCallDispatcher extends Dispatcher<{}, BindingCallInitializer
|
||||||
this._reject!(parseError(params.error));
|
this._reject!(parseError(params.error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function axNodeToProtocol(axNode: types.SerializedAXNode): AXNode {
|
|
||||||
const result: AXNode = {
|
|
||||||
...axNode,
|
|
||||||
valueNumber: typeof axNode.value === 'number' ? axNode.value : undefined,
|
|
||||||
valueString: typeof axNode.value === 'string' ? axNode.value : undefined,
|
|
||||||
checked: axNode.checked === true ? 'checked' : axNode.checked === false ? 'unchecked' : axNode.checked,
|
|
||||||
pressed: axNode.pressed === true ? 'pressed' : axNode.pressed === false ? 'released' : axNode.pressed,
|
|
||||||
children: axNode.children ? axNode.children.map(axNodeToProtocol) : undefined,
|
|
||||||
};
|
|
||||||
delete (result as any).value;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -290,7 +290,8 @@ export type LaunchPersistentOptions = LaunchOptionsBase & BrowserContextOptions;
|
||||||
export type SerializedAXNode = {
|
export type SerializedAXNode = {
|
||||||
role: string,
|
role: string,
|
||||||
name: string,
|
name: string,
|
||||||
value?: string|number,
|
valueString?: string,
|
||||||
|
valueNumber?: number,
|
||||||
description?: string,
|
description?: string,
|
||||||
|
|
||||||
keyshortcuts?: string,
|
keyshortcuts?: string,
|
||||||
|
|
@ -307,8 +308,8 @@ export type SerializedAXNode = {
|
||||||
required?: boolean,
|
required?: boolean,
|
||||||
selected?: boolean,
|
selected?: boolean,
|
||||||
|
|
||||||
checked?: boolean | 'mixed',
|
checked?: 'checked' | 'unchecked' | 'mixed',
|
||||||
pressed?: boolean | 'mixed',
|
pressed?: 'pressed' | 'released' | 'mixed',
|
||||||
|
|
||||||
level?: number,
|
level?: number,
|
||||||
valuemin?: number,
|
valuemin?: number,
|
||||||
|
|
|
||||||
|
|
@ -182,8 +182,18 @@ class WKAXNode implements accessibility.AXNode {
|
||||||
node.roledescription = roledescription;
|
node.roledescription = roledescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('value' in this._payload && this._payload.role !== 'text')
|
if ('value' in this._payload && this._payload.role !== 'text') {
|
||||||
node.value = this._payload.value;
|
if (typeof this._payload.value === 'string')
|
||||||
|
node.valueString = this._payload.value;
|
||||||
|
else if (typeof this._payload.value === 'number')
|
||||||
|
node.valueNumber = this._payload.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('checked' in this._payload)
|
||||||
|
node.checked = this._payload.checked === 'true' ? 'checked' : this._payload.checked === 'false' ? 'unchecked' : 'mixed';
|
||||||
|
|
||||||
|
if ('pressed' in this._payload)
|
||||||
|
node.pressed = this._payload.pressed === 'true' ? 'pressed' : this._payload.pressed === 'false' ? 'released' : 'mixed';
|
||||||
|
|
||||||
const userStringProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Page.AXNode> = [
|
const userStringProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Page.AXNode> = [
|
||||||
'keyshortcuts',
|
'keyshortcuts',
|
||||||
|
|
@ -217,16 +227,6 @@ class WKAXNode implements accessibility.AXNode {
|
||||||
(node as any)[booleanProperty] = value;
|
(node as any)[booleanProperty] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tristateProperties: ('checked'|'pressed')[] = [
|
|
||||||
'checked',
|
|
||||||
'pressed',
|
|
||||||
];
|
|
||||||
for (const tristateProperty of tristateProperties) {
|
|
||||||
if (!(tristateProperty in this._payload))
|
|
||||||
continue;
|
|
||||||
const value = this._payload[tristateProperty];
|
|
||||||
node[tristateProperty] = value === 'mixed' ? 'mixed' : value === 'true' ? true : false;
|
|
||||||
}
|
|
||||||
const numericalProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Page.AXNode> = [
|
const numericalProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Page.AXNode> = [
|
||||||
'level',
|
'level',
|
||||||
'valuemax',
|
'valuemax',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue