// Copyright 2020 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. #include "extensions/renderer/api/automation/automation_api_util.h" #include "content/public/renderer/render_frame.h" #include "extensions/common/extension_messages.h" #include "third_party/blink/public/web/web_ax_object.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_element.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_node.h" namespace extensions { bool ShouldIgnoreAXEvent(ax::mojom::Event event_type) { // Important note: if you are getting here as a result of a compilation error // while adding or removing enum values from ax::mojom::Event, please ensure // you keep that enum in sync with EventType in // extensions/common/api/automation.idl // The stringified enum value gets mapped directly from one enum to another. switch (event_type) { // Generated by AXEventGenerator. This list have values we're interested // from the intersection of ui::AXEventGenerator::Event and // ax::mojom::Event. case ax::mojom::Event::kActiveDescendantChanged: case ax::mojom::Event::kAriaAttributeChanged: case ax::mojom::Event::kCheckedStateChanged: case ax::mojom::Event::kChildrenChanged: case ax::mojom::Event::kDocumentSelectionChanged: case ax::mojom::Event::kDocumentTitleChanged: case ax::mojom::Event::kExpandedChanged: case ax::mojom::Event::kLoadComplete: case ax::mojom::Event::kLoadStart: case ax::mojom::Event::kRowCollapsed: case ax::mojom::Event::kRowCountChanged: case ax::mojom::Event::kRowExpanded: case ax::mojom::Event::kSelectedChildrenChanged: return true; // All other ax events. case ax::mojom::Event::kNone: case ax::mojom::Event::kAlert: case ax::mojom::Event::kAutocorrectionOccured: case ax::mojom::Event::kBlur: case ax::mojom::Event::kClicked: case ax::mojom::Event::kControlsChanged: case ax::mojom::Event::kEndOfTest: case ax::mojom::Event::kFocus: case ax::mojom::Event::kFocusAfterMenuClose: case ax::mojom::Event::kFocusContext: case ax::mojom::Event::kHide: case ax::mojom::Event::kHitTestResult: case ax::mojom::Event::kHover: case ax::mojom::Event::kImageFrameUpdated: case ax::mojom::Event::kLayoutComplete: case ax::mojom::Event::kLiveRegionCreated: case ax::mojom::Event::kLiveRegionChanged: case ax::mojom::Event::kLocationChanged: case ax::mojom::Event::kMediaStartedPlaying: case ax::mojom::Event::kMediaStoppedPlaying: case ax::mojom::Event::kMenuEnd: case ax::mojom::Event::kMenuListValueChanged: case ax::mojom::Event::kMenuPopupEnd: case ax::mojom::Event::kMenuPopupStart: case ax::mojom::Event::kMenuStart: case ax::mojom::Event::kMouseCanceled: case ax::mojom::Event::kMouseDragged: case ax::mojom::Event::kMouseMoved: case ax::mojom::Event::kMousePressed: case ax::mojom::Event::kMouseReleased: case ax::mojom::Event::kScrolledToAnchor: case ax::mojom::Event::kScrollPositionChanged: case ax::mojom::Event::kSelection: case ax::mojom::Event::kSelectionAdd: case ax::mojom::Event::kSelectionRemove: case ax::mojom::Event::kShow: case ax::mojom::Event::kStateChanged: case ax::mojom::Event::kTextChanged: case ax::mojom::Event::kWindowActivated: case ax::mojom::Event::kWindowDeactivated: case ax::mojom::Event::kWindowVisibilityChanged: case ax::mojom::Event::kTextSelectionChanged: case ax::mojom::Event::kTooltipClosed: case ax::mojom::Event::kTooltipOpened: case ax::mojom::Event::kTreeChanged: case ax::mojom::Event::kValueChanged: return false; } NOTREACHED(); return false; } bool ShouldIgnoreGeneratedEvent(ui::AXEventGenerator::Event event_type) { // Important note: if you are getting here as a result of a compilation error // while adding or removing enum values from ui::AXEventGenerator::Event, // please ensure you keep that enum in sync with EventType in // extensions/common/api/automation.idl // The stringified enum value gets mapped directly from one enum to another. switch (event_type) { // These enum values should be mapped to automation.idl. case ui::AXEventGenerator::Event::ACCESS_KEY_CHANGED: case ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED: case ui::AXEventGenerator::Event::ALERT: case ui::AXEventGenerator::Event::ATOMIC_CHANGED: case ui::AXEventGenerator::Event::AUTO_COMPLETE_CHANGED: case ui::AXEventGenerator::Event::BUSY_CHANGED: case ui::AXEventGenerator::Event::CHECKED_STATE_CHANGED: case ui::AXEventGenerator::Event::CHILDREN_CHANGED: case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED: case ui::AXEventGenerator::Event::COLLAPSED: case ui::AXEventGenerator::Event::CONTROLS_CHANGED: case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED: case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED: case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::ENABLED_CHANGED: case ui::AXEventGenerator::Event::EXPANDED: case ui::AXEventGenerator::Event::FOCUS_CHANGED: case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED: case ui::AXEventGenerator::Event::FLOW_TO_CHANGED: case ui::AXEventGenerator::Event::GRABBED_CHANGED: case ui::AXEventGenerator::Event::HASPOPUP_CHANGED: case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED: case ui::AXEventGenerator::Event::IGNORED_CHANGED: case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: case ui::AXEventGenerator::Event::INVALID_STATUS_CHANGED: case ui::AXEventGenerator::Event::KEY_SHORTCUTS_CHANGED: case ui::AXEventGenerator::Event::LABELED_BY_CHANGED: case ui::AXEventGenerator::Event::LANGUAGE_CHANGED: case ui::AXEventGenerator::Event::LAYOUT_INVALIDATED: case ui::AXEventGenerator::Event::LIVE_REGION_CHANGED: case ui::AXEventGenerator::Event::LIVE_REGION_CREATED: case ui::AXEventGenerator::Event::LIVE_REGION_NODE_CHANGED: case ui::AXEventGenerator::Event::LIVE_RELEVANT_CHANGED: case ui::AXEventGenerator::Event::LIVE_STATUS_CHANGED: case ui::AXEventGenerator::Event::LOAD_COMPLETE: case ui::AXEventGenerator::Event::LOAD_START: case ui::AXEventGenerator::Event::MENU_ITEM_SELECTED: case ui::AXEventGenerator::Event::MULTILINE_STATE_CHANGED: case ui::AXEventGenerator::Event::MULTISELECTABLE_STATE_CHANGED: case ui::AXEventGenerator::Event::NAME_CHANGED: case ui::AXEventGenerator::Event::OBJECT_ATTRIBUTE_CHANGED: case ui::AXEventGenerator::Event::OTHER_ATTRIBUTE_CHANGED: case ui::AXEventGenerator::Event::PARENT_CHANGED: case ui::AXEventGenerator::Event::PLACEHOLDER_CHANGED: case ui::AXEventGenerator::Event::PORTAL_ACTIVATED: case ui::AXEventGenerator::Event::POSITION_IN_SET_CHANGED: case ui::AXEventGenerator::Event::RELATED_NODE_CHANGED: case ui::AXEventGenerator::Event::READONLY_CHANGED: case ui::AXEventGenerator::Event::REQUIRED_STATE_CHANGED: case ui::AXEventGenerator::Event::ROLE_CHANGED: case ui::AXEventGenerator::Event::ROW_COUNT_CHANGED: case ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED: case ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED: case ui::AXEventGenerator::Event::SELECTED_CHANGED: case ui::AXEventGenerator::Event::SELECTED_CHILDREN_CHANGED: case ui::AXEventGenerator::Event::SELECTED_VALUE_CHANGED: case ui::AXEventGenerator::Event::SET_SIZE_CHANGED: case ui::AXEventGenerator::Event::SORT_CHANGED: case ui::AXEventGenerator::Event::STATE_CHANGED: case ui::AXEventGenerator::Event::SUBTREE_CREATED: case ui::AXEventGenerator::Event::TEXT_ATTRIBUTE_CHANGED: case ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED: case ui::AXEventGenerator::Event::RANGE_VALUE_CHANGED: case ui::AXEventGenerator::Event::RANGE_VALUE_MAX_CHANGED: case ui::AXEventGenerator::Event::RANGE_VALUE_MIN_CHANGED: case ui::AXEventGenerator::Event::RANGE_VALUE_STEP_CHANGED: return false; // These enum values can be ignored and should not be mapped. case ui::AXEventGenerator::Event::ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED: case ui::AXEventGenerator::Event::WIN_IACCESSIBLE_STATE_CHANGED: case ui::AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED: return true; } NOTREACHED(); return false; } } // namespace extensions