Skip to content

Commit

Permalink
AX ITM: Stop unnecessarily caching 35 live-tree-only properties
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=244766
rdar://problem/99531165

Reviewed by Chris Fleizach.

We are currently caching a lot of properties for functions that
are useful only in the context of the live tree. This is wasteful
in terms of CPU and memory. With this patch, those properties are
removed from the AXCoreObject interface and therefore no longer cached
for isolated objects.

* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
* Source/WebCore/accessibility/AccessibilityNodeObject.h:
* Source/WebCore/accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::isSearchField const):
(WebCore::AccessibilityObject::isMediaTimeline const):
(WebCore::AccessibilityObject::isColumnHeaderCell const):
(WebCore::AccessibilityObject::isRowHeaderCell const):
(WebCore::AccessibilityObject::isIncrementor const):
(WebCore::AccessibilityObject::canvasHasFallbackContent const):
(WebCore::AccessibilityObject::speakAsProperty const):
(WebCore::AccessibilityObject::isMathText const):
(WebCore::AccessibilityObject::isMathNumber const):
(WebCore::AccessibilityObject::isMathOperator const):
(WebCore::AccessibilityObject::isMathFenceOperator const):
(WebCore::AccessibilityObject::isMathSeparatorOperator const):
(WebCore::AccessibilityObject::isMathIdentifier const):
(WebCore::AccessibilityObject::webAreaObject const):
* Source/WebCore/accessibility/AccessibilityObjectInterface.h:
* Source/WebCore/accessibility/AccessibilitySlider.h:
* Source/WebCore/accessibility/AccessibilityTable.h:
* Source/WebCore/accessibility/AccessibilityTableCell.cpp:
(WebCore::AccessibilityTableCell::columnHeaders):
(WebCore::AccessibilityTableCell::rowHeaders):
* Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper accessibilityValue]):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeProperties):
(WebCore::AXIsolatedObject::isHovered const): Deleted.
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:

Canonical link: https://commits.webkit.org/254144@main
  • Loading branch information
twilco committed Sep 4, 2022
1 parent d351688 commit 14ffd24
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 178 deletions.
57 changes: 28 additions & 29 deletions Source/WebCore/accessibility/AccessibilityObject.h
Expand Up @@ -131,16 +131,16 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool isContainedByPasswordField() const override;
AccessibilityObject* passwordFieldOrContainingPasswordField() override { return nullptr; }
bool isNativeTextControl() const override { return false; }
bool isSearchField() const override { return false; }
virtual bool isSearchField() const { return false; }
bool isListBoxOption() const override { return false; }
bool isAttachment() const override { return false; }
bool isMediaTimeline() const override { return false; }
bool isMediaTimeline() const { return false; }
bool isMenuRelated() const override { return false; }
bool isMenu() const override { return false; }
bool isMenuBar() const override { return false; }
bool isMenuButton() const override { return false; }
bool isMenuItem() const override { return false; }
bool isFileUploadButton() const override;
bool isFileUploadButton() const;
bool isInputImage() const override { return false; }
bool isProgressIndicator() const override { return false; }
bool isSlider() const override { return false; }
Expand All @@ -150,14 +150,13 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool isLabel() const override { return false; }

bool isList() const override { return false; }
bool isUnorderedList() const override { return false; }
bool isOrderedList() const override { return false; }
bool isDescriptionList() const override { return false; }
virtual bool isUnorderedList() const { return false; }
virtual bool isOrderedList() const { return false; }
virtual bool isDescriptionList() const { return false; }

// Table support.
bool isTable() const override { return false; }
bool isExposable() const override { return true; }
bool isDataTable() const override { return false; }
int tableLevel() const override { return 0; }
bool supportsSelectedRows() const override { return false; }
AccessibilityChildrenVector columns() override { return AccessibilityChildrenVector(); }
Expand All @@ -179,8 +178,8 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
std::pair<unsigned, unsigned> rowIndexRange() const override { return { 0, 1 }; }
// Returns the start location and column span of the cell.
std::pair<unsigned, unsigned> columnIndexRange() const override { return { 0, 1 }; }
bool isColumnHeaderCell() const override { return false; }
bool isRowHeaderCell() const override { return false; }
virtual bool isColumnHeaderCell() const { return false; }
virtual bool isRowHeaderCell() const { return false; }
int axColumnIndex() const override { return -1; }
int axRowIndex() const override { return -1; }

Expand Down Expand Up @@ -208,7 +207,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
AXCoreObject* incrementButton() override { return nullptr; }
AXCoreObject* decrementButton() override { return nullptr; }
bool isSpinButtonPart() const override { return false; }
bool isIncrementor() const override { return false; }
virtual bool isIncrementor() const { return false; }
bool isMockObject() const override { return false; }
virtual bool isMediaControlLabel() const { return false; }
bool isMediaObject() const override { return false; }
Expand All @@ -217,18 +216,18 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool isNonNativeTextControl() const override;
bool isButton() const override;
bool isLandmark() const override;
bool isRangeControl() const override;
bool isMeter() const override;
bool isRangeControl() const;
bool isMeter() const;
bool isStyleFormatGroup() const override;
bool isFigureElement() const override;
bool isKeyboardFocusable() const override;
bool isOutput() const override;
bool isOutput() const;

bool isChecked() const override { return false; }
bool isEnabled() const override { return false; }
bool isSelected() const override { return false; }
bool isFocused() const override { return false; }
bool isHovered() const override { return false; }
virtual bool isHovered() const { return false; }
bool isIndeterminate() const override { return false; }
bool isLoaded() const override { return false; }
bool isMultiSelectable() const override { return false; }
Expand All @@ -241,7 +240,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
virtual bool isLinked() const { return false; }
bool isExpanded() const override;
bool isVisible() const override { return true; }
bool isCollapsed() const override { return false; }
virtual bool isCollapsed() const { return false; }
void setIsExpanded(bool) override { }
FloatRect unobscuredContentRect() const override;
FloatRect relativeFrame() const override;
Expand Down Expand Up @@ -286,8 +285,8 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
AccessibilityObjectInclusion defaultObjectInclusion() const override;
bool accessibilityIsIgnoredByDefault() const override;

bool isShowingValidationMessage() const override;
String validationMessage() const override;
bool isShowingValidationMessage() const;
String validationMessage() const;

unsigned blockquoteLevel() const override;
unsigned headingLevel() const override { return 0; }
Expand Down Expand Up @@ -319,9 +318,9 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool supportsPressed() const override;
bool supportsExpanded() const override;
bool supportsChecked() const override;
bool supportsRowCountChange() const override;
bool supportsRowCountChange() const;
AccessibilitySortDirection sortDirection() const override;
bool canvasHasFallbackContent() const override { return false; }
virtual bool canvasHasFallbackContent() const { return false; }
bool supportsRangeValue() const override;
String identifierAttribute() const override;
String linkRelValue() const override;
Expand Down Expand Up @@ -645,7 +644,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool supportsARIAAttributes() const;

// CSS3 Speech properties.
OptionSet<SpeakAs> speakAsProperty() const override { return OptionSet<SpeakAs> { }; }
virtual OptionSet<SpeakAs> speakAsProperty() const { return OptionSet<SpeakAs> { }; }

// Make this object visible by scrolling as many nested scrollable views as needed.
void scrollToMakeVisible() const override;
Expand All @@ -671,12 +670,12 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
bool isMathUnderOver() const override { return false; }
bool isMathRoot() const override { return false; }
bool isMathSquareRoot() const override { return false; }
bool isMathText() const override { return false; }
bool isMathNumber() const override { return false; }
bool isMathOperator() const override { return false; }
bool isMathFenceOperator() const override { return false; }
bool isMathSeparatorOperator() const override { return false; }
bool isMathIdentifier() const override { return false; }
virtual bool isMathText() const { return false; }
virtual bool isMathNumber() const { return false; }
virtual bool isMathOperator() const { return false; }
virtual bool isMathFenceOperator() const { return false; }
virtual bool isMathSeparatorOperator() const { return false; }
virtual bool isMathIdentifier() const { return false; }
bool isMathTable() const override { return false; }
bool isMathTableRow() const override { return false; }
bool isMathTableCell() const override { return false; }
Expand Down Expand Up @@ -706,7 +705,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
String mathFencedOpenString() const override { return String(); }
String mathFencedCloseString() const override { return String(); }
int mathLineThickness() const override { return 0; }
bool isAnonymousMathOperator() const override { return false; }
virtual bool isAnonymousMathOperator() const { return false; }

// Multiscripts components.
void mathPrescripts(AccessibilityMathMultiscriptPairs&) override { }
Expand Down Expand Up @@ -746,7 +745,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
#if PLATFORM(COCOA)
bool preventKeyboardDOMEventDispatch() const override;
void setPreventKeyboardDOMEventDispatch(bool) override;
bool fileUploadButtonReturnsValueInTitle() const override;
bool fileUploadButtonReturnsValueInTitle() const;
String speechHintAttributeValue() const override;
String descriptionAttributeValue() const override;
String helpTextAttributeValue() const override;
Expand All @@ -764,7 +763,7 @@ class AccessibilityObject : public AXCoreObject, public CanMakeWeakPtr<Accessibi
AccessibilityObject* highestEditableAncestor() override;

const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const;
AccessibilityObject* webAreaObject() const override { return nullptr; }
virtual AccessibilityObject* webAreaObject() const { return nullptr; }

void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = { }; }
void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
Expand Down
33 changes: 0 additions & 33 deletions Source/WebCore/accessibility/AccessibilityObjectInterface.h
Expand Up @@ -865,20 +865,17 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual bool isContainedByPasswordField() const = 0;
virtual AXCoreObject* passwordFieldOrContainingPasswordField() = 0;
virtual bool isNativeTextControl() const = 0;
virtual bool isSearchField() const = 0;
bool isWebArea() const { return roleValue() == AccessibilityRole::WebArea; }
bool isCheckbox() const { return roleValue() == AccessibilityRole::CheckBox; }
bool isRadioButton() const { return roleValue() == AccessibilityRole::RadioButton; }
bool isListBox() const { return roleValue() == AccessibilityRole::ListBox; }
virtual bool isListBoxOption() const = 0;
virtual bool isAttachment() const = 0;
virtual bool isMediaTimeline() const = 0;
virtual bool isMenuRelated() const = 0;
virtual bool isMenu() const = 0;
virtual bool isMenuBar() const = 0;
virtual bool isMenuButton() const = 0;
virtual bool isMenuItem() const = 0;
virtual bool isFileUploadButton() const = 0;
virtual bool isInputImage() const = 0;
virtual bool isProgressIndicator() const = 0;
virtual bool isSlider() const = 0;
Expand All @@ -888,14 +885,10 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual bool isLabel() const = 0;
// lists support (l, ul, ol, dl)
virtual bool isList() const = 0;
virtual bool isUnorderedList() const = 0;
virtual bool isOrderedList() const = 0;
virtual bool isDescriptionList() const = 0;

// Table support.
virtual bool isTable() const = 0;
virtual bool isExposable() const = 0;
virtual bool isDataTable() const = 0;
virtual int tableLevel() const = 0;
virtual bool supportsSelectedRows() const = 0;
virtual AccessibilityChildrenVector columns() = 0;
Expand All @@ -919,8 +912,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual std::pair<unsigned, unsigned> rowIndexRange() const = 0;
// Returns the start location and column span of the cell.
virtual std::pair<unsigned, unsigned> columnIndexRange() const = 0;
virtual bool isColumnHeaderCell() const = 0;
virtual bool isRowHeaderCell() const = 0;
virtual int axColumnIndex() const = 0;
virtual int axRowIndex() const = 0;

Expand Down Expand Up @@ -951,7 +942,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual AXCoreObject* incrementButton() = 0;
virtual AXCoreObject* decrementButton() = 0;
virtual bool isSpinButtonPart() const = 0;
virtual bool isIncrementor() const = 0;

virtual bool isMockObject() const = 0;
virtual bool isMediaObject() const = 0;
Expand Down Expand Up @@ -987,18 +977,14 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
#endif

virtual bool isLandmark() const = 0;
virtual bool isRangeControl() const = 0;
virtual bool isMeter() const = 0;
virtual bool isStyleFormatGroup() const = 0;
virtual bool isFigureElement() const = 0;
virtual bool isKeyboardFocusable() const = 0;
virtual bool isOutput() const = 0;

virtual bool isChecked() const = 0;
virtual bool isEnabled() const = 0;
virtual bool isSelected() const = 0;
virtual bool isFocused() const = 0;
virtual bool isHovered() const = 0;
virtual bool isIndeterminate() const = 0;
virtual bool isLoaded() const = 0;
virtual bool isMultiSelectable() const = 0;
Expand All @@ -1012,7 +998,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual bool supportsRequiredAttribute() const = 0;
virtual bool isExpanded() const = 0;
virtual bool isVisible() const = 0;
virtual bool isCollapsed() const = 0;
virtual void setIsExpanded(bool) = 0;
virtual FloatRect relativeFrame() const = 0;
virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
Expand Down Expand Up @@ -1054,9 +1039,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual AccessibilityObjectInclusion defaultObjectInclusion() const = 0;
virtual bool accessibilityIsIgnoredByDefault() const = 0;

virtual bool isShowingValidationMessage() const = 0;
virtual String validationMessage() const = 0;

virtual unsigned blockquoteLevel() const = 0;
virtual unsigned headingLevel() const = 0;
virtual AccessibilityButtonState checkboxOrRadioValue() const = 0;
Expand Down Expand Up @@ -1105,9 +1087,7 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual bool supportsPressed() const = 0;
virtual bool supportsExpanded() const = 0;
virtual bool supportsChecked() const = 0;
virtual bool supportsRowCountChange() const = 0;
virtual AccessibilitySortDirection sortDirection() const = 0;
virtual bool canvasHasFallbackContent() const = 0;
virtual bool supportsRangeValue() const = 0;
virtual String identifierAttribute() const = 0;
virtual String linkRelValue() const = 0;
Expand Down Expand Up @@ -1383,9 +1363,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual String readOnlyValue() const = 0;
virtual String autoCompleteValue() const = 0;

// CSS3 Speech properties.
virtual OptionSet<SpeakAs> speakAsProperty() const = 0;

// Make this object visible by scrolling as many nested scrollable views as needed.
virtual void scrollToMakeVisible() const = 0;
// Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
Expand All @@ -1404,12 +1381,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual bool isMathUnderOver() const = 0;
virtual bool isMathRoot() const = 0;
virtual bool isMathSquareRoot() const = 0;
virtual bool isMathText() const = 0;
virtual bool isMathNumber() const = 0;
virtual bool isMathOperator() const = 0;
virtual bool isMathFenceOperator() const = 0;
virtual bool isMathSeparatorOperator() const = 0;
virtual bool isMathIdentifier() const = 0;
virtual bool isMathTable() const = 0;
virtual bool isMathTableRow() const = 0;
virtual bool isMathTableCell() const = 0;
Expand Down Expand Up @@ -1437,7 +1408,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual String mathFencedOpenString() const = 0;
virtual String mathFencedCloseString() const = 0;
virtual int mathLineThickness() const = 0;
virtual bool isAnonymousMathOperator() const = 0;

// Multiscripts components.
typedef std::pair<AXCoreObject*, AXCoreObject*> AccessibilityMathMultiscriptPair;
Expand Down Expand Up @@ -1468,7 +1438,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
#if PLATFORM(COCOA)
virtual bool preventKeyboardDOMEventDispatch() const = 0;
virtual void setPreventKeyboardDOMEventDispatch(bool) = 0;
virtual bool fileUploadButtonReturnsValueInTitle() const = 0;
virtual String speechHintAttributeValue() const = 0;
virtual String descriptionAttributeValue() const = 0;
virtual String helpTextAttributeValue() const = 0;
Expand All @@ -1488,8 +1457,6 @@ class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
virtual AXCoreObject* editableAncestor() = 0;
virtual AXCoreObject* highestEditableAncestor() = 0;

virtual AXCoreObject* webAreaObject() const = 0;

virtual PAL::SessionID sessionID() const = 0;
virtual String documentURI() const = 0;
virtual String documentEncoding() const = 0;
Expand Down
7 changes: 4 additions & 3 deletions Source/WebCore/accessibility/AccessibilityTable.h
Expand Up @@ -93,9 +93,6 @@ class AccessibilityTable : public AccessibilityRenderObject {
// Used in type checking function is<AccessibilityTable>.
bool isAccessibilityTableInstance() const final { return true; }

// isDataTable is whether it is exposed as an AccessibilityTable because the heuristic
// think this "looks" like a data-based table (instead of a table used for layout).
bool isDataTable() const final;
bool computeAccessibilityIsIgnored() const final;

private:
Expand All @@ -104,6 +101,10 @@ class AccessibilityTable : public AccessibilityRenderObject {
HTMLTableElement* tableElement() const;
void addChildrenFromSection(RenderTableSection*, unsigned& maxColumnCount);
void addTableCellChild(AccessibilityObject*, HashSet<AccessibilityObject*>& appendedRows, unsigned& columnCount);

// isDataTable is whether it is exposed as an AccessibilityTable because the heuristic
// think this "looks" like a data-based table (instead of a table used for layout).
bool isDataTable() const;
};

} // namespace WebCore
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/accessibility/AccessibilityTableCell.cpp
Expand Up @@ -261,7 +261,7 @@ AXCoreObject::AccessibilityChildrenVector AccessibilityTableCell::columnHeaders(
const AtomString& scope = downcast<AccessibilityObject>(tableCell)->getAttribute(scopeAttr);
if (scope == "colgroup"_s && isTableCellInSameColGroup(tableCell))
headers.append(tableCell);
else if (tableCell->isColumnHeaderCell())
else if (downcast<AccessibilityObject>(tableCell)->isColumnHeaderCell())
headers.append(tableCell);
}

Expand All @@ -286,7 +286,7 @@ AXCoreObject::AccessibilityChildrenVector AccessibilityTableCell::rowHeaders()
const AtomString& scope = downcast<AccessibilityObject>(tableCell)->getAttribute(scopeAttr);
if (scope == "rowgroup"_s && isTableCellInSameRowGroup(tableCell))
headers.append(tableCell);
else if (tableCell->isRowHeaderCell())
else if (downcast<AccessibilityObject>(tableCell)->isRowHeaderCell())
headers.append(tableCell);
}

Expand Down
Expand Up @@ -1538,7 +1538,7 @@ - (NSString *)accessibilityValue
if (value)
return value;

Ref<AXCoreObject> backingObject = *self.axBackingObject;
Ref<AccessibilityObject> backingObject = *self.axBackingObject;
if (backingObject->supportsCheckedState()) {
switch (backingObject->checkboxOrRadioValue()) {
case AccessibilityButtonState::Off:
Expand Down

0 comments on commit 14ffd24

Please sign in to comment.