blob: 64eaf79ee498167efdd6dcc1bb96b944344c784c [file] [edit]
/*
* Copyright (C) 2014-2025 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 PLATFORM(IOS_FAMILY)
#include "AccessibilityUIElement.h"
#include <wtf/RetainPtr.h>
#include <wtf/WeakObjCPtr.h>
namespace WTR {
class AccessibilityUIElementIOS final : public AccessibilityUIElement {
public:
static Ref<AccessibilityUIElementIOS> create(PlatformUIElement);
static Ref<AccessibilityUIElementIOS> create(const AccessibilityUIElementIOS&);
~AccessibilityUIElementIOS();
PlatformUIElement platformUIElement() override { return m_element.getAutoreleased(); }
// AccessibilityUIElement overrides
bool isValid() const override;
bool isEqual(AccessibilityUIElement* otherElement) override;
JSRetainPtr<JSStringRef> domIdentifier() const override;
RefPtr<AccessibilityUIElement> headerElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> linkedElement() override;
void getLinkedUIElements(Vector<RefPtr<AccessibilityUIElement>>&);
void getDocumentLinks(Vector<RefPtr<AccessibilityUIElement>>&);
JSValueRef children(JSContextRef) override;
unsigned childrenCount() override;
RefPtr<AccessibilityUIElement> childAtIndex(unsigned) override;
Vector<RefPtr<AccessibilityUIElement>> getChildren() const;
Vector<RefPtr<AccessibilityUIElement>> getChildrenInRange(unsigned location, unsigned length) const;
RefPtr<AccessibilityUIElement> elementAtPoint(int x, int y) override;
unsigned indexOfChild(AccessibilityUIElement*) override;
RefPtr<AccessibilityUIElement> linkedUIElementAtIndex(unsigned) override;
JSValueRef detailsElements(JSContextRef) override;
JSValueRef errorMessageElements(JSContextRef) override;
RefPtr<AccessibilityUIElement> ariaOwnsElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> ariaFlowToElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> ariaActionsElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> ariaControlsElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> ariaDetailsElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> ariaErrorMessageElementAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> disclosedRowAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> rowAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> selectedChildAtIndex(unsigned) const override;
unsigned selectedChildrenCount() const override;
JSRetainPtr<JSStringRef> allAttributes() override;
JSRetainPtr<JSStringRef> attributesOfLinkedUIElements() override;
RefPtr<AccessibilityUIElement> titleUIElement() override;
RefPtr<AccessibilityUIElement> parentElement() override;
JSRetainPtr<JSStringRef> attributesOfChildren() override;
JSRetainPtr<JSStringRef> parameterizedAttributeNames() override;
JSRetainPtr<JSStringRef> role() override;
JSRetainPtr<JSStringRef> subrole() override;
JSRetainPtr<JSStringRef> roleDescription() override;
JSRetainPtr<JSStringRef> computedRoleString() override;
JSRetainPtr<JSStringRef> title() override;
JSRetainPtr<JSStringRef> description() override;
JSRetainPtr<JSStringRef> language() override;
JSRetainPtr<JSStringRef> stringValue() override;
JSRetainPtr<JSStringRef> accessibilityValue() const override;
JSRetainPtr<JSStringRef> helpText() const override;
JSRetainPtr<JSStringRef> orientation() const override;
double x() override;
double y() override;
double width() override;
double height() override;
double intValue() const override;
double minValue() override;
double maxValue() override;
JSRetainPtr<JSStringRef> valueDescription() override;
int insertionPointLineNumber() override;
JSRetainPtr<JSStringRef> selectedTextRange() override;
bool isEnabled() override;
bool isRequired() const override;
bool isFocused() const override;
bool isFocusable() const override;
bool isSelected() const override;
bool isSelectable() const override;
bool isMultiSelectable() const override;
void setSelectedChild(AccessibilityUIElement*) const override;
void setSelectedChildAtIndex(unsigned) const override;
void removeSelectionAtIndex(unsigned) const override;
void clearSelectedChildren() const override;
bool isExpanded() const override;
bool isChecked() const override;
bool isIndeterminate() const override;
bool isVisible() const override;
bool isOffScreen() const override;
bool isCollapsed() const override;
bool isIgnored() const override;
bool isRemotePlatformElement() const override;
bool isSingleLine() const override;
bool isMultiLine() const override;
bool hasPopup() const override;
JSRetainPtr<JSStringRef> popupValue() const override;
int hierarchicalLevel() const override;
double clickPointX() override;
double clickPointY() override;
JSRetainPtr<JSStringRef> documentEncoding();
JSRetainPtr<JSStringRef> documentURI();
JSRetainPtr<JSStringRef> url() override;
JSRetainPtr<JSStringRef> classList() const override;
// Additional platform-specific methods
JSRetainPtr<JSStringRef> identifier() override;
JSRetainPtr<JSStringRef> traits() override;
int elementTextPosition() override;
int elementTextLength() override;
JSRetainPtr<JSStringRef> stringForSelection() override;
void increaseTextSelection() override;
void decreaseTextSelection() override;
RefPtr<AccessibilityUIElement> fieldsetAncestorElement() override;
bool scrollPageUp() override;
bool scrollPageDown() override;
bool scrollPageLeft() override;
bool scrollPageRight() override;
bool hasTextEntryTrait() override;
bool hasTabBarTrait() override;
bool hasMenuItemTrait() override;
bool isSearchField() const override;
bool isSwitch() const override;
bool isTextArea() const override;
void assistiveTechnologySimulatedFocus() override;
JSRetainPtr<JSStringRef> customContent() const override;
JSRetainPtr<JSStringRef> brailleLabel() const override;
JSRetainPtr<JSStringRef> brailleRoleDescription() const override;
JSRetainPtr<JSStringRef> embeddedImageDescription() const override;
JSRetainPtr<JSStringRef> imageDataSize() const override;
JSRetainPtr<JSStringRef> imageDataForParameters(int resizeWidth, int resizeHeight) const override;
JSRetainPtr<JSStringRef> imageDataForParametersWithFormat(int resizeWidth, int resizeHeight, JSStringRef format) const override;
JSRetainPtr<JSStringRef> imageDataForSubrect(int resizeWidth, int resizeHeight, int left, int top, int width, int height) const override;
JSValueRef imageOverlayElements(JSContextRef) override;
bool hasDocumentRoleAncestor() const;
bool hasWebApplicationAncestor() const;
bool isInDescriptionListDetail() const override;
bool isInDescriptionListTerm() const override;
bool isInCell() const override;
bool isInTable() const override;
bool isInLandmark() const override;
bool isInList() const override;
JSValueRef selectedChildren(JSContextRef) override;
// Attribute methods
JSRetainPtr<JSStringRef> stringDescriptionOfAttributeValue(JSStringRef attribute) override;
JSRetainPtr<JSStringRef> stringAttributeValue(JSStringRef attribute) override;
double numberAttributeValue(JSStringRef attribute) override;
JSValueRef uiElementArrayAttributeValue(JSContextRef, JSStringRef attribute) override;
RefPtr<AccessibilityUIElement> uiElementAttributeValue(JSStringRef attribute) const override;
bool boolAttributeValue(JSStringRef attribute) override;
bool isAttributeSettable(JSStringRef attribute) override;
bool isAttributeSupported(JSStringRef attribute) override;
// Table methods
JSValueRef rowHeaders(JSContextRef) override;
JSValueRef columnHeaders(JSContextRef) override;
JSValueRef selectedCells(JSContextRef) override;
RefPtr<AccessibilityUIElement> selectedRowAtIndex(unsigned) override;
RefPtr<AccessibilityUIElement> disclosedByRow() override;
// Other methods
JSRetainPtr<JSStringRef> attributesOfDocumentLinks() override;
JSRetainPtr<JSStringRef> liveRegionRelevant() const override;
JSRetainPtr<JSStringRef> liveRegionStatus() const override;
double pageX() override;
double pageY() override;
// Action support
bool isPressActionSupported() override;
bool isIncrementActionSupported() override;
bool isDecrementActionSupported() override;
// State methods
bool isAtomicLiveRegion() const override;
bool isBusy() const override;
bool isSelectedOptionActive() const override;
bool supportsExpanded() const override;
bool isGrabbed() const override;
// Focus
RefPtr<AccessibilityUIElement> focusedElement() const override;
// ARIA
JSRetainPtr<JSStringRef> currentStateValue() const override;
JSRetainPtr<JSStringRef> sortDirection() const override;
JSRetainPtr<JSStringRef> speakAs() override;
JSRetainPtr<JSStringRef> ariaDropEffects() const override;
// Text/Range methods
JSRetainPtr<JSStringRef> lineRectsAndText() const override;
int lineForIndex(int) override;
JSRetainPtr<JSStringRef> rangeForLine(int) override;
JSRetainPtr<JSStringRef> rangeForPosition(int x, int y) override;
JSRetainPtr<JSStringRef> boundsForRange(unsigned location, unsigned length) override;
JSRetainPtr<JSStringRef> stringForRange(unsigned location, unsigned length) override;
JSRetainPtr<JSStringRef> attributedStringForRange(unsigned location, unsigned length) override;
JSRetainPtr<JSStringRef> attributedStringForElement() override;
bool attributedStringRangeIsMisspelled(unsigned location, unsigned length) override;
// Search methods
unsigned uiElementCountForSearchPredicate(JSContextRef, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly) override;
RefPtr<AccessibilityUIElement> uiElementForSearchPredicate(JSContextRef, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly) override;
JSValueRef uiElementsForSearchPredicate(JSContextRef, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly, unsigned resultsLimit) override;
JSRetainPtr<JSStringRef> selectTextWithCriteria(JSContextRef, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity) override;
// Table attribute methods
JSRetainPtr<JSStringRef> attributesOfColumnHeaders() override;
JSRetainPtr<JSStringRef> attributesOfRowHeaders() override;
JSRetainPtr<JSStringRef> attributesOfColumns() override;
JSRetainPtr<JSStringRef> attributesOfRows() override;
JSRetainPtr<JSStringRef> attributesOfVisibleCells() override;
JSRetainPtr<JSStringRef> attributesOfHeader() override;
// Table cell methods
int rowCount() override;
int columnCount() override;
int indexInTable() override;
JSRetainPtr<JSStringRef> rowIndexRange() override;
JSRetainPtr<JSStringRef> columnIndexRange() override;
RefPtr<AccessibilityUIElement> cellForColumnAndRow(unsigned col, unsigned row) override;
// Scrollbar methods
RefPtr<AccessibilityUIElement> horizontalScrollbar() const override;
RefPtr<AccessibilityUIElement> verticalScrollbar() const override;
// Scrolling methods
void scrollToMakeVisible() override;
void scrollToGlobalPoint(int x, int y) override;
void scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height) override;
// Selection methods
RefPtr<AccessibilityTextMarkerRange> intersectionWithSelectionRange() override;
bool setSelectedTextMarkerRange(AccessibilityTextMarkerRange*) override;
bool setSelectedTextRange(unsigned location, unsigned length) override;
JSRetainPtr<JSStringRef> textInputMarkedRange() const override;
// Action methods
void increment() override;
void decrement() override;
void showMenu() override;
void press() override;
bool dismiss() override;
bool invokeCustomActionAtIndex(unsigned) override;
// Focus and selection actions
void takeFocus() override;
void takeSelection() override;
void addSelection() override;
void removeSelection() override;
// Notification methods
bool addNotificationListener(JSContextRef, JSValueRef functionCallback) override;
bool removeNotificationListener() override;
// Date/time
JSRetainPtr<JSStringRef> dateTimeValue() const override;
// Math
JSRetainPtr<JSStringRef> mathPostscriptsDescription() const override;
JSRetainPtr<JSStringRef> mathPrescriptsDescription() const override;
// Path
JSRetainPtr<JSStringRef> pathDescription() const override;
JSRetainPtr<JSStringRef> pathAsBounds() const override;
// Supported actions
JSRetainPtr<JSStringRef> supportedActions() const override;
// Insertion/deletion
bool isInsertion() const override;
bool isDeletion() const override;
bool isFirstItemInSuggestion() const override;
bool isLastItemInSuggestion() const override;
bool isMarkAnnotation() const override;
bool isFrameGeometryInitialized() const override;
// Text input
bool insertText(JSStringRef) override;
bool replaceTextInRange(JSStringRef, int position, int length) override;
// Text marker methods
RefPtr<AccessibilityTextMarker> textMarkerForPoint(int x, int y) override;
RefPtr<AccessibilityTextMarker> textMarkerForIndex(int) override;
RefPtr<AccessibilityTextMarker> startTextMarker() override;
RefPtr<AccessibilityTextMarker> endTextMarker() override;
bool isTextMarkerValid(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> previousTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> nextTextMarker(AccessibilityTextMarker*) override;
JSRetainPtr<JSStringRef> stringForTextMarkerRange(AccessibilityTextMarkerRange*) override;
int textMarkerRangeLength(AccessibilityTextMarkerRange*) override;
RefPtr<AccessibilityTextMarker> startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*) override;
RefPtr<AccessibilityTextMarker> endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*) override;
RefPtr<AccessibilityTextMarker> startTextMarkerForBounds(int x, int y, int width, int height) override;
RefPtr<AccessibilityTextMarker> endTextMarkerForBounds(int x, int y, int width, int height) override;
RefPtr<AccessibilityUIElement> accessibilityElementForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> textMarkerRangeForElement(AccessibilityUIElement*) override;
RefPtr<AccessibilityTextMarkerRange> textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> intersectTextMarkerRanges(AccessibilityTextMarkerRange*, AccessibilityTextMarkerRange*) override;
int indexForTextMarker(AccessibilityTextMarker*) override;
JSRetainPtr<JSStringRef> rectsForTextMarkerRange(AccessibilityTextMarkerRange*, JSStringRef) override;
JSRetainPtr<JSStringRef> attributedStringForTextMarkerRange(AccessibilityTextMarkerRange*) override;
JSRetainPtr<JSStringRef> attributedStringForTextMarkerRangeWithDidSpellCheck(AccessibilityTextMarkerRange*) override;
JSRetainPtr<JSStringRef> attributedStringForTextMarkerRangeWithOptions(AccessibilityTextMarkerRange*, bool) override;
bool attributedStringForTextMarkerRangeContainsAttribute(JSStringRef, AccessibilityTextMarkerRange*) override;
RefPtr<AccessibilityTextMarkerRange> lineTextMarkerRangeForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> leftWordTextMarkerRangeForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> rightWordTextMarkerRangeForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> previousWordStartTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> nextWordEndTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> paragraphTextMarkerRangeForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarker> nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*) override;
RefPtr<AccessibilityTextMarkerRange> textMarkerRangeForSearchPredicate(JSContextRef, AccessibilityTextMarkerRange* startRange, bool forward, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly) override;
RefPtr<AccessibilityTextMarkerRange> misspellingTextMarkerRange(AccessibilityTextMarkerRange* start, bool forward) override;
RefPtr<AccessibilityTextMarkerRange> textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*) override;
private:
AccessibilityUIElementIOS(PlatformUIElement);
AccessibilityUIElementIOS(const AccessibilityUIElementIOS&);
WeakObjCPtr<id> m_element;
RetainPtr<id> m_notificationHandler;
};
} // namespace WTR
#endif // PLATFORM(IOS_FAMILY)