📄 accessibilityobjectwrapper.mm
字号:
} return m_object->accessibilityDescription(); } if ([attributeName isEqualToString: NSAccessibilityValueAttribute]) { if (m_object->isAttachment()) { if ([[[self attachmentView] accessibilityAttributeNames] containsObject:NSAccessibilityValueAttribute]) return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityValueAttribute]; } if (m_object->isProgressIndicator() || m_object->isSlider()) return [NSNumber numberWithFloat:m_object->valueForRange()]; if (m_object->hasIntValue()) return [NSNumber numberWithInt:m_object->intValue()]; return m_object->stringValue(); } if ([attributeName isEqualToString: NSAccessibilityMinValueAttribute]) return [NSNumber numberWithFloat:m_object->minValueForRange()]; if ([attributeName isEqualToString: NSAccessibilityMaxValueAttribute]) return [NSNumber numberWithFloat:m_object->maxValueForRange()]; if ([attributeName isEqualToString: NSAccessibilityHelpAttribute]) return m_object->helpText(); if ([attributeName isEqualToString: NSAccessibilityFocusedAttribute]) return [NSNumber numberWithBool: m_object->isFocused()]; if ([attributeName isEqualToString: NSAccessibilityEnabledAttribute]) return [NSNumber numberWithBool: m_object->isEnabled()]; if ([attributeName isEqualToString: NSAccessibilitySizeAttribute]) { IntSize s = m_object->size(); return [NSValue valueWithSize: NSMakeSize(s.width(), s.height())]; } if ([attributeName isEqualToString: NSAccessibilityPositionAttribute]) return [self position]; if ([attributeName isEqualToString: NSAccessibilityWindowAttribute] || [attributeName isEqualToString: NSAccessibilityTopLevelUIElementAttribute]) { FrameView* fv = m_object->documentFrameView(); if (fv) return [fv->platformWidget() window]; return nil; } if ([attributeName isEqualToString:NSAccessibilityAccessKeyAttribute]) { AtomicString accessKey = m_object->accessKey(); if (accessKey.isNull()) return nil; return accessKey; } if (m_object->isDataTable()) { // TODO: distinguish between visible and non-visible rows if ([attributeName isEqualToString:NSAccessibilityRowsAttribute] || [attributeName isEqualToString:NSAccessibilityVisibleRowsAttribute]) { return convertToNSArray(static_cast<AccessibilityTable*>(m_object)->rows()); } // TODO: distinguish between visible and non-visible columns if ([attributeName isEqualToString:NSAccessibilityColumnsAttribute] || [attributeName isEqualToString:NSAccessibilityVisibleColumnsAttribute]) { return convertToNSArray(static_cast<AccessibilityTable*>(m_object)->columns()); } // HTML tables don't support these if ([attributeName isEqualToString:NSAccessibilitySelectedColumnsAttribute] || [attributeName isEqualToString:NSAccessibilitySelectedRowsAttribute] || [attributeName isEqualToString:NSAccessibilitySelectedCellsAttribute]) return nil; if ([attributeName isEqualToString:(NSString *)kAXColumnHeaderUIElementsAttribute]) { AccessibilityObject::AccessibilityChildrenVector columnHeaders; static_cast<AccessibilityTable*>(m_object)->columnHeaders(columnHeaders); return convertToNSArray(columnHeaders); } if ([attributeName isEqualToString:NSAccessibilityHeaderAttribute]) { AccessibilityObject* headerContainer = static_cast<AccessibilityTable*>(m_object)->headerContainer(); if (headerContainer) return headerContainer->wrapper(); return nil; } if ([attributeName isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) { AccessibilityObject::AccessibilityChildrenVector rowHeaders; static_cast<AccessibilityTable*>(m_object)->rowHeaders(rowHeaders); return convertToNSArray(rowHeaders); } if ([attributeName isEqualToString:NSAccessibilityVisibleCellsAttribute]) { AccessibilityObject::AccessibilityChildrenVector cells; static_cast<AccessibilityTable*>(m_object)->cells(cells); return convertToNSArray(cells); } } if (m_object->isTableRow()) { if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) return [NSNumber numberWithInt:static_cast<AccessibilityTableRow*>(m_object)->rowIndex()]; } if (m_object->isTableColumn()) { if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) return [NSNumber numberWithInt:static_cast<AccessibilityTableColumn*>(m_object)->columnIndex()]; // rows attribute for a column is the list of all the elements in that column at each row if ([attributeName isEqualToString:NSAccessibilityRowsAttribute] || [attributeName isEqualToString:NSAccessibilityVisibleRowsAttribute]) { return convertToNSArray(static_cast<AccessibilityTableColumn*>(m_object)->children()); } if ([attributeName isEqualToString:NSAccessibilityHeaderAttribute]) { AccessibilityObject* header = static_cast<AccessibilityTableColumn*>(m_object)->headerObject(); if (!header) return nil; return header->wrapper(); } } if (m_object->isTableCell()) { if ([attributeName isEqualToString:NSAccessibilityRowIndexRangeAttribute]) { pair<int, int> rowRange; static_cast<AccessibilityTableCell*>(m_object)->rowIndexRange(rowRange); return [NSValue valueWithRange:NSMakeRange(rowRange.first, rowRange.second)]; } if ([attributeName isEqualToString:NSAccessibilityColumnIndexRangeAttribute]) { pair<int, int> columnRange; static_cast<AccessibilityTableCell*>(m_object)->columnIndexRange(columnRange); return [NSValue valueWithRange:NSMakeRange(columnRange.first, columnRange.second)]; } } if ((m_object->isListBox() ||m_object->isList()) && [attributeName isEqualToString:NSAccessibilityOrientationAttribute]) return NSAccessibilityVerticalOrientationValue; if ([attributeName isEqualToString: @"AXSelectedTextMarkerRange"]) return [self textMarkerRangeForSelection]; if (m_object->isAccessibilityRenderObject()) { RenderObject* renderer = static_cast<AccessibilityRenderObject*>(m_object)->renderer(); if (!renderer) return nil; if ([attributeName isEqualToString: @"AXStartTextMarker"]) return textMarkerForVisiblePosition(startOfDocument(renderer->document())); if ([attributeName isEqualToString: @"AXEndTextMarker"]) return textMarkerForVisiblePosition(endOfDocument(renderer->document())); if ([attributeName isEqualToString:NSAccessibilityBlockQuoteLevelAttribute]) return [NSNumber numberWithInt:blockquoteLevel(renderer)]; } else { if ([attributeName isEqualToString:NSAccessibilityBlockQuoteLevelAttribute]) { AccessibilityObject* parent = m_object->parentObjectUnignored(); if (!parent) return [NSNumber numberWithInt:0]; return [parent->wrapper() accessibilityAttributeValue:NSAccessibilityBlockQuoteLevelAttribute]; } } if ([attributeName isEqualToString: NSAccessibilityLinkedUIElementsAttribute]) { AccessibilityObject::AccessibilityChildrenVector linkedUIElements; m_object->linkedUIElements(linkedUIElements); if (linkedUIElements.size() == 0) return nil; return convertToNSArray(linkedUIElements); } if ([attributeName isEqualToString: NSAccessibilitySelectedAttribute]) return [NSNumber numberWithBool:m_object->isSelected()]; if ([attributeName isEqualToString: NSAccessibilityServesAsTitleForUIElementsAttribute] && m_object->isMenuButton()) { AccessibilityObject* uiElement = static_cast<AccessibilityRenderObject*>(m_object)->menuForMenuButton(); if (uiElement) return [NSArray arrayWithObject:uiElement->wrapper()]; } if ([attributeName isEqualToString:NSAccessibilityTitleUIElementAttribute]) { AccessibilityObject* obj = m_object->titleUIElement(); if (obj) return obj->wrapper(); return nil; } return nil;}- (id)accessibilityFocusedUIElement{ if (!m_object) return nil; m_object->updateBackingStore(); RefPtr<AccessibilityObject> focusedObj = m_object->focusedUIElement(); if (!focusedObj) return nil; return focusedObj->wrapper();}- (id)accessibilityHitTest:(NSPoint)point{ if (!m_object) return nil; m_object->updateBackingStore(); RefPtr<AccessibilityObject> axObject = m_object->doAccessibilityHitTest(IntPoint(point)); if (axObject) return NSAccessibilityUnignoredAncestor(axObject->wrapper()); return NSAccessibilityUnignoredAncestor(self);}- (BOOL)accessibilityIsAttributeSettable:(NSString*)attributeName{ if (!m_object) return nil; m_object->updateBackingStore(); if ([attributeName isEqualToString: @"AXSelectedTextMarkerRange"]) return YES; if ([attributeName isEqualToString: NSAccessibilityFocusedAttribute]) return m_object->canSetFocusAttribute(); if ([attributeName isEqualToString: NSAccessibilityValueAttribute]) return m_object->canSetValueAttribute(); if ([attributeName isEqualToString: NSAccessibilitySelectedAttribute]) return m_object->canSetSelectedAttribute(); if ([attributeName isEqualToString: NSAccessibilitySelectedChildrenAttribute]) return m_object->canSetSelectedChildrenAttribute(); if ([attributeName isEqualToString: NSAccessibilitySelectedTextAttribute] || [attributeName isEqualToString: NSAccessibilitySelectedTextRangeAttribute] || [attributeName isEqualToString: NSAccessibilityVisibleCharacterRangeAttribute]) return m_object->canSetTextRangeAttributes(); return NO;}// accessibilityShouldUseUniqueId is an AppKit method we override so that// objects will be given a unique ID, and therefore allow AppKit to know when they// become obsolete (e.g. when the user navigates to a new web page, making this one// unrendered but not deallocated because it is in the back/forward cache).// It is important to call NSAccessibilityUnregisterUniqueIdForUIElement in the// appropriate place (e.g. dealloc) to remove these non-retained references from// AppKit's id mapping tables. We do this in detach by calling unregisterUniqueIdForUIElement.//// Registering an object is also required for observing notifications. Only registered objects can be observed.- (BOOL)accessibilityIsIgnored{ if (!m_object) return nil; m_object->updateBackingStore(); if (m_object->isAttachment()) return [[self attachmentView] accessibilityIsIgnored]; return m_object->accessibilityIsIgnored();}- (NSArray* )accessibilityParameterizedAttributeNames{ if (!m_object) return nil; m_object->updateBackingStore(); if (m_object->isAttachment()) return nil; static NSArray* paramAttrs = nil; static NSArray* textParamAttrs = nil; static NSArray* tableParamAttrs = nil; if (paramAttrs == nil) { paramAttrs = [[NSArray alloc] initWithObjects: @"AXUIElementForTextMarker", @"AXTextMarkerRangeForUIElement", @"AXLineForTextMarker", @"AXTextMarkerRangeForLine", @"AXStringForTextMarkerRange", @"AXTextMarkerForPosition", @"AXBoundsForTextMarkerRange", @"AXAttributedStringForTextMarkerRange", @"AXTextMarkerRangeForUnorderedTextMarkers", @"AXNextTextMarkerForTextMarker", @"AXPreviousTextMarkerForTextMarker", @"AXLeftWordTextMarkerRangeForTextMarker", @"AXRightWordTextMarkerRangeForTextMarker", @"AXLeftLineTextMarkerRangeForTextMarker", @"AXRightLineTextMarkerRangeForTextMarker", @"AXSentenceTextMarkerRangeForTextMarker", @"AXParagraphTextMarkerRangeForTextMarker", @"AXNextWordEndTextMarkerForTextMarker", @"AXPreviousWordStartTextMarkerForTextMarker", @"AXNextLineEndTextMarkerForTextMarker", @"AXPreviousLineStartTextMarkerForTextMarker", @"AXNextSentenceEndTextMarkerForTextMarker", @"AXPreviousSentenceStartTextMarkerForTextMarker", @"AXNextParagraphEndTextMarkerForTextMarker", @"AXPreviousParagraphStartTextMarkerForTextMarker", @"AXStyleTextMarkerRangeForTextMarker", @"AXLengthForTextMarkerRange", NSAccessibilityBoundsForRangeParameterizedAttribute, nil]; } if (textParamAttrs == nil) { NSMutableArray* tempArray = [[NSMutableArray alloc] initWithArray:paramAttrs]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -