chore: align SerializedAXNode with rpc protocol AXNode (#3522)

This commit is contained in:
Dmitry Gozman 2020-08-18 20:25:03 -07:00 committed by GitHub
parent 97157520a6
commit 63a2c673b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 41 additions and 62 deletions

View File

@ -203,20 +203,15 @@ class CRAXNode implements accessibility.AXNode {
const properties: Map<string, number | string | boolean> = new Map();
for (const property of this._payload.properties || [])
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)
properties.set('description', this._payload.description.value);
const node: {[x in keyof types.SerializedAXNode]: any} = {
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> = [
'value',
'description',
'keyshortcuts',
'roledescription',
@ -227,7 +222,6 @@ class CRAXNode implements accessibility.AXNode {
continue;
node[userStringProperty] = properties.get(userStringProperty);
}
const booleanProperties: Array<keyof types.SerializedAXNode> = [
'disabled',
'expanded',
@ -249,17 +243,6 @@ class CRAXNode implements accessibility.AXNode {
continue;
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> = [
'level',
'valuemax',
@ -282,7 +265,19 @@ class CRAXNode implements accessibility.AXNode {
continue;
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 {

View File

@ -202,11 +202,10 @@ class FFAXNode implements accessibility.AXNode {
serialize(): types.SerializedAXNode {
const node: {[x in keyof types.SerializedAXNode]: any} = {
role: FFRoleToARIARole.get(this._role) || this._role,
name: this._name || ''
name: this._name || '',
};
const userStringProperties: Array<keyof types.SerializedAXNode & keyof Protocol.Accessibility.AXTree> = [
'name',
'value',
'description',
'roledescription',
'valuetext',
@ -236,16 +235,6 @@ class FFAXNode implements accessibility.AXNode {
continue;
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> = [
'level'
];
@ -266,6 +255,13 @@ class FFAXNode implements accessibility.AXNode {
continue;
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;
}
}

View File

@ -20,7 +20,7 @@ import { Frame } from '../../frames';
import { Request } from '../../network';
import { Page, Worker } from '../../page';
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 { parseError, serializeError } from '../serializers';
import { ConsoleMessageDispatcher } from './consoleMessageDispatcher';
@ -184,7 +184,7 @@ export class PageDispatcher extends Dispatcher<Page, PageInitializer> implements
interestingOnly: params.interestingOnly,
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 }> {
@ -274,16 +274,3 @@ export class BindingCallDispatcher extends Dispatcher<{}, BindingCallInitializer
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;
}

View File

@ -290,7 +290,8 @@ export type LaunchPersistentOptions = LaunchOptionsBase & BrowserContextOptions;
export type SerializedAXNode = {
role: string,
name: string,
value?: string|number,
valueString?: string,
valueNumber?: number,
description?: string,
keyshortcuts?: string,
@ -307,8 +308,8 @@ export type SerializedAXNode = {
required?: boolean,
selected?: boolean,
checked?: boolean | 'mixed',
pressed?: boolean | 'mixed',
checked?: 'checked' | 'unchecked' | 'mixed',
pressed?: 'pressed' | 'released' | 'mixed',
level?: number,
valuemin?: number,

View File

@ -182,8 +182,18 @@ class WKAXNode implements accessibility.AXNode {
node.roledescription = roledescription;
}
if ('value' in this._payload && this._payload.role !== 'text')
node.value = this._payload.value;
if ('value' in this._payload && this._payload.role !== 'text') {
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> = [
'keyshortcuts',
@ -217,16 +227,6 @@ class WKAXNode implements accessibility.AXNode {
(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> = [
'level',
'valuemax',