blob: 9513dc8c592693984504352b75d5b6604ab52e5f [file] [log] [blame]
/*
* Copyright (C) 2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
#include "AXObjectCache.h"
#include "AccessibilityObjectInterface.h"
#include "IntPoint.h"
#include "LayoutRect.h"
#include "Path.h"
#include <variant>
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/RefPtr.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Vector.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class AXIsolatedTree;
class AXIsolatedObject final : public AXCoreObject {
friend class AXIsolatedTree;
public:
static Ref<AXIsolatedObject> create(Ref<AXCoreObject>, AXIsolatedTree*);
~AXIsolatedObject();
void setObjectID(AXID id) override { m_id = id; }
AXID objectID() const override { return m_id; }
void init() override;
void attachPlatformWrapper(AccessibilityObjectWrapper*);
bool isDetached() const override;
private:
void detachRemoteParts(AccessibilityDetachmentType) override;
void detachPlatformWrapper(AccessibilityDetachmentType) override;
AXID parent() const { return m_parentID; }
AXIsolatedTree* tree() const { return m_cachedTree.get(); }
AXIsolatedObject() = default;
AXIsolatedObject(Ref<AXCoreObject>, AXIsolatedTree*);
bool isAXIsolatedObjectInstance() const override { return true; }
AXCoreObject* associatedAXObject() const;
enum class IsRoot : bool { Yes, No };
void initializeProperties(Ref<AXCoreObject>, IsRoot);
void initializePlatformProperties(Ref<const AXCoreObject>, IsRoot);
void setProperty(AXPropertyName, AXPropertyValueVariant&&, bool shouldRemove = false);
void setObjectProperty(AXPropertyName, AXCoreObject*);
void setObjectVectorProperty(AXPropertyName, const AccessibilityChildrenVector&);
// FIXME: consolidate all AttributeValue retrieval in a single template method.
bool boolAttributeValue(AXPropertyName) const;
String stringAttributeValue(AXPropertyName) const;
int intAttributeValue(AXPropertyName) const;
unsigned unsignedAttributeValue(AXPropertyName) const;
double doubleAttributeValue(AXPropertyName) const;
float floatAttributeValue(AXPropertyName) const;
AXCoreObject* objectAttributeValue(AXPropertyName) const;
PAL::SessionID sessionIDAttributeValue(AXPropertyName) const;
IntPoint intPointAttributeValue(AXPropertyName) const;
Color colorAttributeValue(AXPropertyName) const;
URL urlAttributeValue(AXPropertyName) const;
uint64_t uint64AttributeValue(AXPropertyName) const;
Path pathAttributeValue(AXPropertyName) const;
template<typename T> T rectAttributeValue(AXPropertyName) const;
template<typename T> Vector<T> vectorAttributeValue(AXPropertyName) const;
template<typename T> OptionSet<T> optionSetAttributeValue(AXPropertyName) const;
template<typename T> std::pair<T, T> pairAttributeValue(AXPropertyName) const;
template<typename T> T propertyValue(AXPropertyName) const;
// The following method performs a lazy caching of the given property.
// If the property is already in m_propertyMap, returns the existing value.
// If not, retrieves the property from the main thread and cache it for later use.
template<typename T> T getOrRetrievePropertyValue(AXPropertyName);
void fillChildrenVectorForProperty(AXPropertyName, AccessibilityChildrenVector&) const;
void setMathscripts(AXPropertyName, AXCoreObject&);
void insertMathPairs(Vector<std::pair<AXID, AXID>>&, AccessibilityMathMultiscriptPairs&);
template<typename U> void performFunctionOnMainThread(U&& lambda) const
{
Accessibility::performFunctionOnMainThread([&lambda, this]() {
if (auto* object = associatedAXObject())
lambda(object);
});
}
// Attribute retrieval overrides.
bool isHeading() const override { return boolAttributeValue(AXPropertyName::IsHeading); }
bool isLandmark() const override { return boolAttributeValue(AXPropertyName::IsLandmark); }
bool isLink() const override { return boolAttributeValue(AXPropertyName::IsLink); }
bool isPasswordField() const override { return boolAttributeValue(AXPropertyName::IsPasswordField); }
bool isSearchField() const override { return boolAttributeValue(AXPropertyName::IsSearchField); }
bool isAttachment() const override { return boolAttributeValue(AXPropertyName::IsAttachment); }
bool isMediaTimeline() const override { return boolAttributeValue(AXPropertyName::IsMediaTimeline); }
bool isMenuRelated() const override { return boolAttributeValue(AXPropertyName::IsMenuRelated); }
bool isMenu() const override { return boolAttributeValue(AXPropertyName::IsMenu); }
bool isMenuBar() const override { return boolAttributeValue(AXPropertyName::IsMenuBar); }
bool isMenuButton() const override { return boolAttributeValue(AXPropertyName::IsMenuButton); }
bool isMenuItem() const override { return boolAttributeValue(AXPropertyName::IsMenuItem); }
bool isFileUploadButton() const override { return boolAttributeValue(AXPropertyName::IsFileUploadButton); }
bool isInputImage() const override { return boolAttributeValue(AXPropertyName::IsInputImage); }
bool isProgressIndicator() const override { return boolAttributeValue(AXPropertyName::IsProgressIndicator); }
bool isSlider() const override { return boolAttributeValue(AXPropertyName::IsSlider); }
bool isControl() const override { return boolAttributeValue(AXPropertyName::IsControl); }
bool isList() const override { return boolAttributeValue(AXPropertyName::IsList); }
bool isUnorderedList() const override { return boolAttributeValue(AXPropertyName::IsUnorderedList); }
bool isOrderedList() const override { return boolAttributeValue(AXPropertyName::IsOrderedList); }
bool isDescriptionList() const override { return boolAttributeValue(AXPropertyName::IsDescriptionList); }
bool isKeyboardFocusable() const override { return boolAttributeValue(AXPropertyName::IsKeyboardFocusable); }
// Table support.
bool isTable() const override { return boolAttributeValue(AXPropertyName::IsTable); }
bool isExposable() const override { return boolAttributeValue(AXPropertyName::IsExposable); }
bool isDataTable() const override { return boolAttributeValue(AXPropertyName::IsDataTable); }
int tableLevel() const override { return intAttributeValue(AXPropertyName::TableLevel); }
bool supportsSelectedRows() const override { return boolAttributeValue(AXPropertyName::SupportsSelectedRows); }
AccessibilityChildrenVector columns() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::Columns)); }
AccessibilityChildrenVector rows() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::Rows)); }
unsigned columnCount() override { return unsignedAttributeValue(AXPropertyName::ColumnCount); }
unsigned rowCount() override { return unsignedAttributeValue(AXPropertyName::RowCount); }
AccessibilityChildrenVector cells() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::Cells)); }
AXCoreObject* cellForColumnAndRow(unsigned, unsigned) override;
AccessibilityChildrenVector columnHeaders() override;
AccessibilityChildrenVector rowHeaders() override;
AccessibilityChildrenVector visibleRows() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::VisibleRows)); }
AXCoreObject* headerContainer() override { return objectAttributeValue(AXPropertyName::HeaderContainer); }
int axColumnCount() const override { return intAttributeValue(AXPropertyName::AXColumnCount); }
int axRowCount() const override { return intAttributeValue(AXPropertyName::AXRowCount); }
// Table cell support.
bool isTableCell() const override { return boolAttributeValue(AXPropertyName::IsTableCell); }
// Returns the start location and row span of the cell.
std::pair<unsigned, unsigned> rowIndexRange() const override { return pairAttributeValue<unsigned>(AXPropertyName::RowIndexRange); }
// Returns the start location and column span of the cell.
std::pair<unsigned, unsigned> columnIndexRange() const override { return pairAttributeValue<unsigned>(AXPropertyName::ColumnIndexRange); }
bool isColumnHeaderCell() const override { return boolAttributeValue(AXPropertyName::IsColumnHeaderCell); }
bool isRowHeaderCell() const override { return boolAttributeValue(AXPropertyName::IsRowHeaderCell); }
int axColumnIndex() const override { return intAttributeValue(AXPropertyName::AXColumnIndex); }
int axRowIndex() const override { return intAttributeValue(AXPropertyName::AXRowIndex); }
// Table column support.
bool isTableColumn() const override { return boolAttributeValue(AXPropertyName::IsTableColumn); }
unsigned columnIndex() const override { return unsignedAttributeValue(AXPropertyName::ColumnIndex); }
AXCoreObject* columnHeader() override { return objectAttributeValue(AXPropertyName::ColumnHeader); }
// Table row support.
bool isTableRow() const override { return boolAttributeValue(AXPropertyName::IsTableRow); }
unsigned rowIndex() const override { return unsignedAttributeValue(AXPropertyName::RowIndex); }
// ARIA tree/grid row support.
bool isARIATreeGridRow() const override { return boolAttributeValue(AXPropertyName::IsARIATreeGridRow); }
AccessibilityChildrenVector disclosedRows() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::DisclosedRows)); }
AXCoreObject* disclosedByRow() const override { return objectAttributeValue(AXPropertyName::DisclosedByRow); }
bool isFieldset() const override { return boolAttributeValue(AXPropertyName::IsFieldset); }
bool isGroup() const override { return boolAttributeValue(AXPropertyName::IsGroup); }
bool isMenuList() const override { return boolAttributeValue(AXPropertyName::IsMenuList); }
bool isMenuListPopup() const override { return boolAttributeValue(AXPropertyName::IsMenuListPopup); }
bool isMenuListOption() const override { return boolAttributeValue(AXPropertyName::IsMenuListOption); }
bool isTextControl() const override { return boolAttributeValue(AXPropertyName::IsTextControl); }
bool isButton() const override { return boolAttributeValue(AXPropertyName::IsButton); }
bool isRangeControl() const override { return boolAttributeValue(AXPropertyName::IsRangeControl); }
bool isMeter() const override { return boolAttributeValue(AXPropertyName::IsMeter); }
bool isStyleFormatGroup() const override { return boolAttributeValue(AXPropertyName::IsStyleFormatGroup); }
bool isOutput() const override { return boolAttributeValue(AXPropertyName::IsOutput); }
bool isChecked() const override { return boolAttributeValue(AXPropertyName::IsChecked); }
bool isEnabled() const override { return boolAttributeValue(AXPropertyName::IsEnabled); }
bool isSelected() const override { return boolAttributeValue(AXPropertyName::IsSelected); }
bool isFocused() const override { return boolAttributeValue(AXPropertyName::IsFocused); }
bool isMultiSelectable() const override { return boolAttributeValue(AXPropertyName::IsMultiSelectable); }
bool isVisited() const override { return boolAttributeValue(AXPropertyName::IsVisited); }
bool isRequired() const override { return boolAttributeValue(AXPropertyName::IsRequired); }
bool supportsRequiredAttribute() const override { return boolAttributeValue(AXPropertyName::SupportsRequiredAttribute); }
bool isExpanded() const override { return boolAttributeValue(AXPropertyName::IsExpanded); }
FloatRect relativeFrame() const override;
bool supportsDatetimeAttribute() const override { return boolAttributeValue(AXPropertyName::SupportsDatetimeAttribute); }
String datetimeAttributeValue() const override { return stringAttributeValue(AXPropertyName::DatetimeAttributeValue); }
bool canSetFocusAttribute() const override { return boolAttributeValue(AXPropertyName::CanSetFocusAttribute); }
bool canSetTextRangeAttributes() const override { return boolAttributeValue(AXPropertyName::CanSetTextRangeAttributes); }
bool canSetValueAttribute() const override { return boolAttributeValue(AXPropertyName::CanSetValueAttribute); }
bool canSetNumericValue() const override { return boolAttributeValue(AXPropertyName::CanSetNumericValue); }
bool canSetSelectedAttribute() const override { return boolAttributeValue(AXPropertyName::CanSetSelectedAttribute); }
bool canSetSelectedChildren() const override { return boolAttributeValue(AXPropertyName::CanSetSelectedChildren); }
bool canSetExpandedAttribute() const override { return boolAttributeValue(AXPropertyName::CanSetExpandedAttribute); }
// We should never create an isolated object from an ignored live object, so we can hardcode this to false.
bool accessibilityIsIgnored() const override { return false; }
bool isShowingValidationMessage() const override { return boolAttributeValue(AXPropertyName::IsShowingValidationMessage); }
String validationMessage() const override { return stringAttributeValue(AXPropertyName::ValidationMessage); }
unsigned blockquoteLevel() const override { return unsignedAttributeValue(AXPropertyName::BlockquoteLevel); }
unsigned headingLevel() const override { return unsignedAttributeValue(AXPropertyName::HeadingLevel); }
AccessibilityButtonState checkboxOrRadioValue() const override { return propertyValue<AccessibilityButtonState>(AXPropertyName::ButtonState); }
String valueDescription() const override { return stringAttributeValue(AXPropertyName::ValueDescription); }
float valueForRange() const override { return floatAttributeValue(AXPropertyName::ValueForRange); }
float maxValueForRange() const override { return floatAttributeValue(AXPropertyName::MaxValueForRange); }
float minValueForRange() const override { return floatAttributeValue(AXPropertyName::MinValueForRange); }
AXCoreObject* selectedRadioButton() override { return objectAttributeValue(AXPropertyName::SelectedRadioButton); }
AXCoreObject* selectedTabItem() override { return objectAttributeValue(AXPropertyName::SelectedTabItem); }
int layoutCount() const override { return intAttributeValue(AXPropertyName::LayoutCount); }
double loadingProgress() const override { return tree()->loadingProgress(); }
bool supportsARIAOwns() const override { return boolAttributeValue(AXPropertyName::SupportsARIAOwns); }
bool isActiveDescendantOfFocusedContainer() const override { return boolAttributeValue(AXPropertyName::IsActiveDescendantOfFocusedContainer); }
bool hasPopup() const override { return boolAttributeValue(AXPropertyName::HasPopup); }
String popupValue() const override { return stringAttributeValue(AXPropertyName::PopupValue); }
bool pressedIsPresent() const override { return boolAttributeValue(AXPropertyName::PressedIsPresent); }
bool ariaIsMultiline() const override { return boolAttributeValue(AXPropertyName::ARIAIsMultiline); }
String invalidStatus() const override { return stringAttributeValue(AXPropertyName::InvalidStatus); }
bool supportsExpanded() const override { return boolAttributeValue(AXPropertyName::SupportsExpanded); }
AccessibilitySortDirection sortDirection() const override { return static_cast<AccessibilitySortDirection>(intAttributeValue(AXPropertyName::SortDirection)); }
bool canvasHasFallbackContent() const override { return boolAttributeValue(AXPropertyName::CanvasHasFallbackContent); }
bool supportsRangeValue() const override { return boolAttributeValue(AXPropertyName::SupportsRangeValue); }
String identifierAttribute() const override { return stringAttributeValue(AXPropertyName::IdentifierAttribute); }
String linkRelValue() const override { return stringAttributeValue(AXPropertyName::LinkRelValue); }
void classList(Vector<String>&) const override;
AccessibilityCurrentState currentState() const override { return static_cast<AccessibilityCurrentState>(intAttributeValue(AXPropertyName::CurrentState)); }
String currentValue() const override { return stringAttributeValue(AXPropertyName::CurrentValue); }
bool supportsCurrent() const override { return boolAttributeValue(AXPropertyName::SupportsCurrent); }
const String keyShortcutsValue() const override { return stringAttributeValue(AXPropertyName::KeyShortcutsValue); }
bool supportsSetSize() const override { return boolAttributeValue(AXPropertyName::SupportsSetSize); }
bool supportsPosInSet() const override { return boolAttributeValue(AXPropertyName::SupportsPosInSet); }
int setSize() const override { return intAttributeValue(AXPropertyName::SetSize); }
int posInSet() const override { return intAttributeValue(AXPropertyName::PosInSet); }
bool supportsDropping() const override { return boolAttributeValue(AXPropertyName::SupportsDropping); }
bool supportsDragging() const override { return boolAttributeValue(AXPropertyName::SupportsDragging); }
bool isGrabbed() override { return boolAttributeValue(AXPropertyName::IsGrabbed); }
Vector<String> determineDropEffects() const override { return vectorAttributeValue<String>(AXPropertyName::DropEffects); }
AXCoreObject* accessibilityHitTest(const IntPoint&) const override;
AXCoreObject* focusedUIElement() const override;
AXCoreObject* parentObject() const override { return parentObjectUnignored(); }
AXCoreObject* parentObjectUnignored() const override;
AccessibilityChildrenVector linkedObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::LinkedObjects)); }
AXCoreObject* titleUIElement() const override { return objectAttributeValue(AXPropertyName::TitleUIElement); }
AXCoreObject* scrollBar(AccessibilityOrientation) override;
AccessibilityRole ariaRoleAttribute() const override { return static_cast<AccessibilityRole>(intAttributeValue(AXPropertyName::ARIARoleAttribute)); }
String computedLabel() override;
int textLength() const override { return intAttributeValue(AXPropertyName::TextLength); }
const String placeholderValue() const override { return stringAttributeValue(AXPropertyName::PlaceholderValue); }
String expandedTextValue() const override { return stringAttributeValue(AXPropertyName::ExpandedTextValue); }
bool supportsExpandedTextValue() const override { return boolAttributeValue(AXPropertyName::SupportsExpandedTextValue); }
SRGBA<uint8_t> colorValue() const override;
AccessibilityRole roleValue() const override { return static_cast<AccessibilityRole>(intAttributeValue(AXPropertyName::RoleValue)); }
String rolePlatformString() const override { return stringAttributeValue(AXPropertyName::RolePlatformString); }
String roleDescription() const override { return stringAttributeValue(AXPropertyName::RoleDescription); }
String subrolePlatformString() const override { return stringAttributeValue(AXPropertyName::SubrolePlatformString); }
String ariaLandmarkRoleDescription() const override { return stringAttributeValue(AXPropertyName::ARIALandmarkRoleDescription); }
bool supportsPressAction() const override;
LayoutRect boundingBoxRect() const override;
LayoutRect elementRect() const override;
IntPoint clickPoint() override { return intPointAttributeValue(AXPropertyName::ClickPoint); }
void accessibilityText(Vector<AccessibilityText>& texts) const override;
String brailleLabel() const override { return stringAttributeValue(AXPropertyName::BrailleLabel); }
String brailleRoleDescription() const override { return stringAttributeValue(AXPropertyName::BrailleRoleDescription); }
String embeddedImageDescription() const override { return stringAttributeValue(AXPropertyName::EmbeddedImageDescription); }
std::optional<AccessibilityChildrenVector> imageOverlayElements() override { return std::nullopt; }
String computedRoleString() const override { return stringAttributeValue(AXPropertyName::ComputedRoleString); }
bool isValueAutofilled() const override { return boolAttributeValue(AXPropertyName::IsValueAutofilled); }
bool isValueAutofillAvailable() const override { return boolAttributeValue(AXPropertyName::IsValueAutofillAvailable); }
AutoFillButtonType valueAutofillButtonType() const override { return static_cast<AutoFillButtonType>(intAttributeValue(AXPropertyName::ValueAutofillButtonType)); }
void ariaTreeRows(AccessibilityChildrenVector& children) override { fillChildrenVectorForProperty(AXPropertyName::ARIATreeRows, children); }
AccessibilityChildrenVector ariaTreeItemContent() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::ARIATreeItemContent)); }
URL url() const override { return urlAttributeValue(AXPropertyName::URL); }
String accessKey() const override { return stringAttributeValue(AXPropertyName::AccessKey); }
String localizedActionVerb() const override { return stringAttributeValue(AXPropertyName::LocalizedActionVerb); }
String actionVerb() const override { return stringAttributeValue(AXPropertyName::ActionVerb); }
String readOnlyValue() const override { return stringAttributeValue(AXPropertyName::ReadOnlyValue); }
String autoCompleteValue() const override { return stringAttributeValue(AXPropertyName::AutoCompleteValue); }
OptionSet<SpeakAs> speakAsProperty() const override { return optionSetAttributeValue<SpeakAs>(AXPropertyName::SpeakAs); }
bool isMathElement() const override { return boolAttributeValue(AXPropertyName::IsMathElement); }
bool isMathFraction() const override { return boolAttributeValue(AXPropertyName::IsMathFraction); }
bool isMathFenced() const override { return boolAttributeValue(AXPropertyName::IsMathFenced); }
bool isMathSubscriptSuperscript() const override { return boolAttributeValue(AXPropertyName::IsMathSubscriptSuperscript); }
bool isMathRow() const override { return boolAttributeValue(AXPropertyName::IsMathRow); }
bool isMathUnderOver() const override { return boolAttributeValue(AXPropertyName::IsMathUnderOver); }
bool isMathRoot() const override { return boolAttributeValue(AXPropertyName::IsMathRoot); }
bool isMathSquareRoot() const override { return boolAttributeValue(AXPropertyName::IsMathSquareRoot); }
bool isMathText() const override { return boolAttributeValue(AXPropertyName::IsMathText); }
bool isMathNumber() const override { return boolAttributeValue(AXPropertyName::IsMathNumber); }
bool isMathOperator() const override { return boolAttributeValue(AXPropertyName::IsMathOperator); }
bool isMathFenceOperator() const override { return boolAttributeValue(AXPropertyName::IsMathFenceOperator); }
bool isMathSeparatorOperator() const override { return boolAttributeValue(AXPropertyName::IsMathSeparatorOperator); }
bool isMathIdentifier() const override { return boolAttributeValue(AXPropertyName::IsMathIdentifier); }
bool isMathTable() const override { return boolAttributeValue(AXPropertyName::IsMathTable); }
bool isMathTableRow() const override { return boolAttributeValue(AXPropertyName::IsMathTableRow); }
bool isMathTableCell() const override { return boolAttributeValue(AXPropertyName::IsMathTableCell); }
bool isMathMultiscript() const override { return boolAttributeValue(AXPropertyName::IsMathMultiscript); }
bool isMathToken() const override { return boolAttributeValue(AXPropertyName::IsMathToken); }
std::optional<AccessibilityChildrenVector> mathRadicand() override;
AXCoreObject* mathRootIndexObject() override { return objectAttributeValue(AXPropertyName::MathRootIndexObject); }
AXCoreObject* mathUnderObject() override { return objectAttributeValue(AXPropertyName::MathUnderObject); }
AXCoreObject* mathOverObject() override { return objectAttributeValue(AXPropertyName::MathOverObject); }
AXCoreObject* mathNumeratorObject() override { return objectAttributeValue(AXPropertyName::MathNumeratorObject); }
AXCoreObject* mathDenominatorObject() override { return objectAttributeValue(AXPropertyName::MathDenominatorObject); }
AXCoreObject* mathBaseObject() override { return objectAttributeValue(AXPropertyName::MathBaseObject); }
AXCoreObject* mathSubscriptObject() override { return objectAttributeValue(AXPropertyName::MathSubscriptObject); }
AXCoreObject* mathSuperscriptObject() override { return objectAttributeValue(AXPropertyName::MathSuperscriptObject); }
String mathFencedOpenString() const override { return stringAttributeValue(AXPropertyName::MathFencedOpenString); }
String mathFencedCloseString() const override { return stringAttributeValue(AXPropertyName::MathFencedCloseString); }
int mathLineThickness() const override { return intAttributeValue(AXPropertyName::MathLineThickness); }
bool isAnonymousMathOperator() const override { return boolAttributeValue(AXPropertyName::IsAnonymousMathOperator); }
void mathPrescripts(AccessibilityMathMultiscriptPairs&) override;
void mathPostscripts(AccessibilityMathMultiscriptPairs&) override;
#if PLATFORM(COCOA)
bool fileUploadButtonReturnsValueInTitle() const override { return boolAttributeValue(AXPropertyName::FileUploadButtonReturnsValueInTitle); }
String speechHintAttributeValue() const override { return stringAttributeValue(AXPropertyName::SpeechHint); }
String descriptionAttributeValue() const override;
String helpTextAttributeValue() const override;
String titleAttributeValue() const override;
#endif
#if PLATFORM(MAC)
bool caretBrowsingEnabled() const override { return boolAttributeValue(AXPropertyName::CaretBrowsingEnabled); }
#endif
AXCoreObject* focusableAncestor() override { return objectAttributeValue(AXPropertyName::FocusableAncestor); }
AXCoreObject* editableAncestor() override { return objectAttributeValue(AXPropertyName::EditableAncestor); }
AXCoreObject* highestEditableAncestor() override { return objectAttributeValue(AXPropertyName::HighestEditableAncestor); }
AccessibilityOrientation orientation() const override { return static_cast<AccessibilityOrientation>(intAttributeValue(AXPropertyName::Orientation)); }
unsigned hierarchicalLevel() const override { return unsignedAttributeValue(AXPropertyName::HierarchicalLevel); }
String language() const override { return stringAttributeValue(AXPropertyName::Language); }
bool canHaveSelectedChildren() const override { return boolAttributeValue(AXPropertyName::CanHaveSelectedChildren); }
void selectedChildren(AccessibilityChildrenVector& children) override { fillChildrenVectorForProperty(AXPropertyName::SelectedChildren, children); }
void setSelectedChildren(const AccessibilityChildrenVector&) override;
void visibleChildren(AccessibilityChildrenVector& children) override { fillChildrenVectorForProperty(AXPropertyName::VisibleChildren, children); }
void tabChildren(AccessibilityChildrenVector& children) override { fillChildrenVectorForProperty(AXPropertyName::TabChildren, children); }
AccessibilityChildrenVector contents() override;
bool hasARIAValueNow() const override { return boolAttributeValue(AXPropertyName::HasARIAValueNow); }
AtomString tagName() const override { return AtomString { stringAttributeValue(AXPropertyName::TagName) }; }
const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) override;
void updateChildrenIfNecessary() override;
bool isDetachedFromParent() override;
bool supportsLiveRegion(bool = true) const override { return boolAttributeValue(AXPropertyName::SupportsLiveRegion); }
bool isInsideLiveRegion(bool = true) const override { return boolAttributeValue(AXPropertyName::IsInsideLiveRegion); }
const String liveRegionStatus() const override { return stringAttributeValue(AXPropertyName::LiveRegionStatus); }
const String liveRegionRelevant() const override { return stringAttributeValue(AXPropertyName::LiveRegionRelevant); }
bool liveRegionAtomic() const override { return boolAttributeValue(AXPropertyName::LiveRegionAtomic); }
bool isBusy() const override { return boolAttributeValue(AXPropertyName::IsBusy); }
bool isInlineText() const override { return boolAttributeValue(AXPropertyName::IsInlineText); }
// Spin button support.
AXCoreObject* incrementButton() override { return objectAttributeValue(AXPropertyName::IncrementButton); }
AXCoreObject* decrementButton() override { return objectAttributeValue(AXPropertyName::DecrementButton); }
bool isIncrementor() const override { return boolAttributeValue(AXPropertyName::IsIncrementor); }
AccessibilityChildrenVector documentLinks() override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::DocumentLinks)); }
bool supportsCheckedState() const override { return boolAttributeValue(AXPropertyName::SupportsCheckedState); }
String stringValue() const override { return stringAttributeValue(AXPropertyName::StringValue); }
// Parameterized attribute retrieval.
Vector<SimpleRange> findTextRanges(const AccessibilitySearchTextCriteria&) const override;
Vector<String> performTextOperation(AccessibilityTextOperation const&) override;
void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) override;
// Attributes retrieved from the root node only so that the data isn't duplicated on each node.
PAL::SessionID sessionID() const override;
String documentURI() const override;
String documentEncoding() const override;
#if PLATFORM(COCOA)
bool preventKeyboardDOMEventDispatch() const override;
#endif
// PlainTextRange support.
PlainTextRange selectedTextRange() const override;
int insertionPointLineNumber() const override;
PlainTextRange doAXRangeForLine(unsigned) const override;
String doAXStringForRange(const PlainTextRange&) const override;
PlainTextRange doAXRangeForPosition(const IntPoint&) const override;
PlainTextRange doAXRangeForIndex(unsigned) const override;
PlainTextRange doAXStyleRangeForIndex(unsigned) const override;
IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override;
IntRect doAXBoundsForRange(const PlainTextRange&) const override;
unsigned doAXLineForIndex(unsigned) override;
VisibleSelection selection() const override;
VisiblePositionRange selectedVisiblePositionRange() const override;
void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override;
// TODO: Text ranges and selection.
String selectedText() const override;
VisiblePositionRange visiblePositionRange() const override;
VisiblePositionRange visiblePositionRangeForLine(unsigned) const override;
std::optional<SimpleRange> elementRange() const override;
VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const override;
VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const override;
VisiblePositionRange positionOfRightWord(const VisiblePosition&) const override;
VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const override;
VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const override;
VisiblePositionRange sentenceForPosition(const VisiblePosition&) const override;
VisiblePositionRange paragraphForPosition(const VisiblePosition&) const override;
VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const override;
VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const override;
VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const override;
std::optional<SimpleRange> rangeForPlainTextRange(const PlainTextRange&) const override;
#if PLATFORM(MAC)
AXTextMarkerRangeRef textMarkerRangeForNSRange(const NSRange&) const override;
#endif
String stringForRange(const SimpleRange&) const override;
IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override;
IntRect boundsForRange(const SimpleRange&) const override;
int lengthForVisiblePositionRange(const VisiblePositionRange&) const override;
VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const override;
VisiblePosition visiblePositionForPoint(const IntPoint&) const override;
VisiblePosition nextVisiblePosition(const VisiblePosition&) const override;
VisiblePosition previousVisiblePosition(const VisiblePosition&) const override;
VisiblePosition nextWordEnd(const VisiblePosition&) const override;
VisiblePosition previousWordStart(const VisiblePosition&) const override;
VisiblePosition nextLineEndPosition(const VisiblePosition&) const override;
VisiblePosition previousLineStartPosition(const VisiblePosition&) const override;
VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const override;
VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override;
VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override;
VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override;
VisiblePosition visiblePositionForIndex(unsigned, bool lastIndexOK) const override;
VisiblePosition visiblePositionForIndex(int) const override;
int indexForVisiblePosition(const VisiblePosition&) const override;
AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const override;
int lineForPosition(const VisiblePosition&) const override;
PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override;
std::optional<SimpleRange> visibleCharacterRange() const override;
int index(const VisiblePosition&) const override;
void lineBreaks(Vector<int>&) const override;
FloatRect unobscuredContentRect() const override;
// Attribute setters.
void setARIAGrabbed(bool) override;
void setIsExpanded(bool) override;
bool setValue(float) override;
void setSelected(bool) override;
void setSelectedRows(AccessibilityChildrenVector&) override;
void setFocused(bool) override;
void setSelectedText(const String&) override;
void setSelectedTextRange(const PlainTextRange&) override;
bool setValue(const String&) override;
#if PLATFORM(MAC)
void setCaretBrowsingEnabled(bool) override;
#endif
#if PLATFORM(COCOA)
void setPreventKeyboardDOMEventDispatch(bool) override;
#endif
String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override;
std::optional<SimpleRange> misspellingRange(const SimpleRange&, AccessibilitySearchDirection) const override;
FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override;
void increment() override;
void decrement() override;
bool performDismissAction() override;
void scrollToMakeVisible() const override;
void scrollToMakeVisibleWithSubFocus(const IntRect&) const override;
void scrollToGlobalPoint(const IntPoint&) const override;
bool replaceTextInRange(const String&, const PlainTextRange&) override;
bool insertText(const String&) override;
void makeRangeVisible(const PlainTextRange&) override;
bool press() override;
bool performDefaultAction() override;
bool isAccessibilityObject() const override { return false; }
// Functions that should never be called on an isolated tree object. ASSERT that these are not reached;
bool isAccessibilityNodeObject() const override;
bool isAccessibilityRenderObject() const override;
bool isAccessibilityScrollbar() const override;
bool isAccessibilityScrollViewInstance() const override;
bool isAXImageInstance() const override;
bool isAccessibilitySVGRoot() const override;
bool isAccessibilitySVGElement() const override;
bool isAccessibilityTableInstance() const override;
bool isAccessibilityTableColumnInstance() const override;
bool isAccessibilityProgressIndicatorInstance() const override;
bool isAccessibilityListBoxInstance() const override;
bool isAttachmentElement() const override;
bool isNativeImage() const override;
bool isImageButton() const override;
bool isContainedByPasswordField() const override;
AXCoreObject* passwordFieldOrContainingPasswordField() override;
bool isNativeTextControl() const override;
bool isListBoxOption() const override;
bool isSliderThumb() const override;
bool isInputSlider() const override;
bool isLabel() const override;
bool isImageMapLink() const override;
bool isNativeSpinButton() const override;
bool isSpinButtonPart() const override;
bool isMockObject() const override;
bool isMediaObject() const override;
bool isARIATextControl() const override;
bool isNonNativeTextControl() const override;
bool isFigureElement() const override;
bool isHovered() const override;
bool isIndeterminate() const override;
bool isLoaded() const override { return loadingProgress() >= 1; }
bool isOnScreen() const override;
bool isOffScreen() const override;
bool isPressed() const override;
bool isUnvisited() const override { return boolAttributeValue(AXPropertyName::IsUnvisited); }
bool isLinked() const override;
bool isVisible() const override { return boolAttributeValue(AXPropertyName::IsVisible); }
bool isCollapsed() const override;
bool isSelectedOptionActive() const override;
bool hasBoldFont() const override { return boolAttributeValue(AXPropertyName::HasBoldFont); }
bool hasItalicFont() const override { return boolAttributeValue(AXPropertyName::HasItalicFont); }
bool hasMisspelling() const override;
bool hasPlainText() const override { return boolAttributeValue(AXPropertyName::HasPlainText); }
bool hasSameFont(const AXCoreObject&) const override;
bool hasSameFontColor(const AXCoreObject&) const override;
bool hasSameStyle(const AXCoreObject&) const override;
bool hasUnderline() const override { return boolAttributeValue(AXPropertyName::HasUnderline); }
bool hasHighlighting() const override { return boolAttributeValue(AXPropertyName::HasHighlighting); }
Element* element() const override;
Node* node() const override;
RenderObject* renderer() const override;
AccessibilityObjectInclusion defaultObjectInclusion() const override;
bool accessibilityIsIgnoredByDefault() const override;
float stepValueForRange() const override;
AXCoreObject* selectedListItem() override;
AccessibilityChildrenVector relatedObjects(AXRelationType) const override;
bool hasDatalist() const override;
bool supportsHasPopup() const override;
bool supportsPressed() const override;
bool supportsChecked() const override;
bool supportsRowCountChange() const override { return boolAttributeValue(AXPropertyName::SupportsRowCountChange); }
bool isModalDescendant(Node*) const override;
bool isModalNode() const override;
AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const override;
AXCoreObject* parentObjectIfExists() const override;
bool isDescendantOfBarrenParent() const override;
bool isDescendantOfRole(AccessibilityRole) const override;
AXCoreObject* observableObject() const override;
AXCoreObject* correspondingLabelForControlElement() const override;
AXCoreObject* correspondingControlForLabelElement() const override;
bool isPresentationalChildOfAriaRole() const override;
bool ariaRoleHasPresentationalChildren() const override;
bool inheritsPresentationalRole() const override;
void setAccessibleName(const AtomString&) override;
bool hasAttributesRequiredForInclusion() const override;
String accessibilityDescription() const override { return stringAttributeValue(AXPropertyName::AccessibilityDescription); }
String title() const override { return stringAttributeValue(AXPropertyName::Title); }
String helpText() const override;
bool isARIAStaticText() const override;
String text() const override;
String ariaLabeledByAttribute() const override;
String ariaDescribedByAttribute() const override;
bool accessibleNameDerivesFromContent() const override;
AXObjectCache* axObjectCache() const override;
Element* anchorElement() const override;
Element* actionElement() const override;
Path elementPath() const override { return pathAttributeValue(AXPropertyName::Path); };
bool supportsPath() const override { return boolAttributeValue(AXPropertyName::SupportsPath); }
TextIteratorBehaviors textIteratorBehaviorForTextRange() const override;
bool isWidget() const override { return boolAttributeValue(AXPropertyName::IsWidget); }
Widget* widget() const override;
PlatformWidget platformWidget() const override;
Widget* widgetForAttachmentView() const override;
HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override;
#if PLATFORM(COCOA)
RemoteAXObjectRef remoteParentObject() const override;
FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override;
#endif
Page* page() const override;
Document* document() const override;
FrameView* documentFrameView() const override;
Frame* frame() const override;
Frame* mainFrame() const override;
Document* topDocument() const override;
ScrollView* scrollView() const override;
ScrollView* scrollViewAncestor() const override;
void detachFromParent() override;
bool shouldFocusActiveDescendant() const override;
AXCoreObject* activeDescendant() const override;
OptionSet<AXAncestorFlag> ancestorFlags() const;
bool hasDocumentRoleAncestor() const override { return ancestorFlags().contains(AXAncestorFlag::HasDocumentRoleAncestor); }
bool hasWebApplicationAncestor() const override { return ancestorFlags().contains(AXAncestorFlag::HasWebApplicationAncestor); }
bool isInDescriptionListDetail() const override { return ancestorFlags().contains(AXAncestorFlag::IsInDescriptionListDetail); }
bool isInDescriptionListTerm() const override { return ancestorFlags().contains(AXAncestorFlag::IsInDescriptionListTerm); }
bool isInCell() const override { return ancestorFlags().contains(AXAncestorFlag::IsInCell); }
AXCoreObject* firstAnonymousBlockChild() const override;
std::optional<String> attributeValue(const String&) const override;
bool hasTagName(const QualifiedName&) const override;
String stringValueForMSAA() const override;
String stringRoleForMSAA() const override;
String nameForMSAA() const override;
String descriptionForMSAA() const override;
AccessibilityRole roleValueForMSAA() const override;
String passwordFieldValue() const override;
AXCoreObject* liveRegionAncestor(bool excludeIfOff = true) const override;
bool hasContentEditableAttributeSet() const override;
bool supportsReadOnly() const override;
bool supportsAutoComplete() const override;
bool supportsARIAAttributes() const override;
bool scrollByPage(ScrollByPageDirection) const override;
IntPoint scrollPosition() const override;
IntSize scrollContentsSize() const override;
IntRect scrollVisibleContentRect() const override;
void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const override;
bool isMathScriptObject(AccessibilityMathScriptObjectType) const override;
bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override;
bool isAXHidden() const override;
bool isDOMHidden() const override;
bool isHidden() const override;
void overrideAttachmentParent(AXCoreObject* parent) override;
bool accessibilityIgnoreAttachment() const override;
AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const override;
#if PLATFORM(COCOA)
bool hasApplePDFAnnotationAttribute() const override { return boolAttributeValue(AXPropertyName::HasApplePDFAnnotationAttribute); }
#endif
const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const override;
AXCoreObject* webAreaObject() const override { return objectAttributeValue(AXPropertyName::WebArea); }
void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData&) override;
void clearIsIgnoredFromParentData() override;
void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
Vector<RetainPtr<id>> modelElementChildren() override;
#endif
void updateBackingStore() override;
String innerHTML() const override;
String outerHTML() const override;
RefPtr<AXIsolatedTree> m_cachedTree;
AXID m_parentID;
AXID m_id;
Vector<AXID> m_childrenIDs;
Vector<RefPtr<AXCoreObject>> m_children;
AXPropertyMap m_propertyMap;
#if PLATFORM(COCOA)
RetainPtr<NSView> m_platformWidget;
RetainPtr<RemoteAXObjectRef> m_remoteParent;
#else
PlatformWidget m_platformWidget;
#endif
};
template<typename T>
inline T AXIsolatedObject::propertyValue(AXPropertyName propertyName) const
{
auto value = m_propertyMap.get(propertyName);
return WTF::switchOn(value,
[] (T& typedValue) -> T { return typedValue; },
[] (auto&) { return T(); }
);
}
} // namespace WebCore
SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(AXIsolatedObject, isAXIsolatedObjectInstance())
#endif // ENABLE((ACCESSIBILITY_ISOLATED_TREE))