| 
									
										
										
										
											2020-06-26 09:01:18 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2017 Google Inc. All rights reserved. | 
					
						
							|  |  |  |  * Modifications copyright (c) Microsoft Corporation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 09:46:11 +08:00
										 |  |  | import { PageChannel, AXNode } from '../../protocol/channels'; | 
					
						
							| 
									
										
										
										
											2020-06-26 09:01:18 +08:00
										 |  |  | import { ElementHandle } from './elementHandle'; | 
					
						
							| 
									
										
										
										
											2020-07-30 08:26:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type SerializedAXNode = Omit<AXNode, 'valueString' | 'valueNumber' | 'children' | 'checked' | 'pressed'> & { | 
					
						
							|  |  |  |   value?: string|number, | 
					
						
							|  |  |  |   checked?: boolean | 'mixed', | 
					
						
							|  |  |  |   pressed?: boolean | 'mixed', | 
					
						
							|  |  |  |   children?: SerializedAXNode[] | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function axNodeFromProtocol(axNode: AXNode): SerializedAXNode { | 
					
						
							|  |  |  |   const result: SerializedAXNode = { | 
					
						
							|  |  |  |     ...axNode, | 
					
						
							|  |  |  |     value: axNode.valueNumber !== undefined ? axNode.valueNumber : axNode.valueString, | 
					
						
							|  |  |  |     checked: axNode.checked === 'checked' ? true : axNode.checked === 'unchecked' ? false : axNode.checked, | 
					
						
							|  |  |  |     pressed: axNode.pressed === 'pressed' ? true : axNode.pressed === 'released' ? false : axNode.pressed, | 
					
						
							|  |  |  |     children: axNode.children ? axNode.children.map(axNodeFromProtocol) : undefined, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   delete (result as any).valueNumber; | 
					
						
							|  |  |  |   delete (result as any).valueString; | 
					
						
							|  |  |  |   return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-06-26 09:01:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class Accessibility { | 
					
						
							|  |  |  |   private _channel: PageChannel; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(channel: PageChannel) { | 
					
						
							|  |  |  |     this._channel = channel; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-30 08:26:59 +08:00
										 |  |  |   async snapshot(options: { interestingOnly?: boolean; root?: ElementHandle } = {}): Promise<SerializedAXNode | null> { | 
					
						
							| 
									
										
										
										
											2020-06-26 09:01:18 +08:00
										 |  |  |     const root = options.root ? options.root._elementChannel : undefined; | 
					
						
							| 
									
										
										
										
											2020-07-15 09:26:50 +08:00
										 |  |  |     const result = await this._channel.accessibilitySnapshot({ interestingOnly: options.interestingOnly, root }); | 
					
						
							| 
									
										
										
										
											2020-07-21 23:26:48 +08:00
										 |  |  |     return result.rootAXNode ? axNodeFromProtocol(result.rootAXNode) : null; | 
					
						
							| 
									
										
										
										
											2020-06-26 09:01:18 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |