📄 accessibilityobjectwrapper.mm
字号:
{ StaticTextRole, NSAccessibilityStaticTextRole }, { TextAreaRole, NSAccessibilityTextAreaRole }, { ScrollAreaRole, NSAccessibilityScrollAreaRole }, { PopUpButtonRole, NSAccessibilityPopUpButtonRole }, { MenuButtonRole, NSAccessibilityMenuButtonRole }, { TableRole, NSAccessibilityTableRole }, { ApplicationRole, NSAccessibilityApplicationRole }, { GroupRole, NSAccessibilityGroupRole }, { RadioGroupRole, NSAccessibilityRadioGroupRole }, { ListRole, NSAccessibilityListRole }, { ScrollBarRole, NSAccessibilityScrollBarRole }, { ValueIndicatorRole, NSAccessibilityValueIndicatorRole }, { ImageRole, NSAccessibilityImageRole }, { MenuBarRole, NSAccessibilityMenuBarRole }, { MenuRole, NSAccessibilityMenuRole }, { MenuItemRole, NSAccessibilityMenuItemRole }, { ColumnRole, NSAccessibilityColumnRole }, { RowRole, NSAccessibilityRowRole }, { ToolbarRole, NSAccessibilityToolbarRole }, { BusyIndicatorRole, NSAccessibilityBusyIndicatorRole }, { ProgressIndicatorRole, NSAccessibilityProgressIndicatorRole }, { WindowRole, NSAccessibilityWindowRole }, { DrawerRole, NSAccessibilityDrawerRole }, { SystemWideRole, NSAccessibilitySystemWideRole }, { OutlineRole, NSAccessibilityOutlineRole }, { IncrementorRole, NSAccessibilityIncrementorRole }, { BrowserRole, NSAccessibilityBrowserRole }, { ComboBoxRole, NSAccessibilityComboBoxRole }, { SplitGroupRole, NSAccessibilitySplitGroupRole }, { SplitterRole, NSAccessibilitySplitterRole }, { ColorWellRole, NSAccessibilityColorWellRole }, { GrowAreaRole, NSAccessibilityGrowAreaRole }, { SheetRole, NSAccessibilitySheetRole }, { HelpTagRole, NSAccessibilityHelpTagRole }, { MatteRole, NSAccessibilityMatteRole }, { RulerRole, NSAccessibilityRulerRole }, { RulerMarkerRole, NSAccessibilityRulerMarkerRole }, { LinkRole, NSAccessibilityLinkRole },#ifndef BUILDING_ON_TIGER { DisclosureTriangleRole, NSAccessibilityDisclosureTriangleRole }, { GridRole, NSAccessibilityGridRole },#endif { WebCoreLinkRole, NSAccessibilityLinkRole }, { ImageMapLinkRole, NSAccessibilityLinkRole }, { ImageMapRole, @"AXImageMap" }, { ListMarkerRole, @"AXListMarker" }, { WebAreaRole, @"AXWebArea" }, { HeadingRole, @"AXHeading" }, { ListBoxRole, NSAccessibilityListRole }, { ListBoxOptionRole, NSAccessibilityStaticTextRole }, // cells don't exist on tiger or leopard#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD) { CellRole, NSAccessibilityGroupRole },#else { CellRole, NSAccessibilityCellRole },#endif { TableHeaderContainerRole, NSAccessibilityGroupRole }, { DefinitionListDefinitionRole, NSAccessibilityGroupRole }, { DefinitionListTermRole, NSAccessibilityGroupRole } }; AccessibilityRoleMap& roleMap = *new AccessibilityRoleMap; const unsigned numRoles = sizeof(roles) / sizeof(roles[0]); for (unsigned i = 0; i < numRoles; ++i) roleMap.set(roles[i].value, roles[i].string); return roleMap;}static NSString* roleValueToNSString(AccessibilityRole value){ ASSERT(value); static const AccessibilityRoleMap& roleMap = createAccessibilityRoleMap(); return roleMap.get(value);}- (NSString*)role{ if (m_object->isAttachment()) return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityRoleAttribute]; NSString* string = roleValueToNSString(m_object->roleValue()); if (string != nil) return string; return NSAccessibilityUnknownRole;}- (NSString*)subrole{ if (m_object->isPasswordField()) return NSAccessibilitySecureTextFieldSubrole; if (m_object->isAttachment()) { NSView* attachView = [self attachmentView]; if ([[attachView accessibilityAttributeNames] containsObject:NSAccessibilitySubroleAttribute]) { return [attachView accessibilityAttributeValue:NSAccessibilitySubroleAttribute]; } } if (m_object->isList()) { AccessibilityList* listObject = static_cast<AccessibilityList*>(m_object); if (listObject->isUnorderedList() || listObject->isOrderedList()) return NSAccessibilityContentListSubrole; if (listObject->isDefinitionList()) return NSAccessibilityDefinitionListSubrole; } return nil;}- (NSString*)roleDescription{ if (!m_object) return nil; // attachments have the AXImage role, but a different subrole if (m_object->isAttachment()) return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityRoleDescriptionAttribute]; // FIXME 3447564: It would be better to call some AppKit API to get these strings // (which would be the best way to localize them) NSString* axRole = [self role]; if ([axRole isEqualToString:NSAccessibilityButtonRole]) return NSAccessibilityRoleDescription(NSAccessibilityButtonRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityPopUpButtonRole]) return NSAccessibilityRoleDescription(NSAccessibilityPopUpButtonRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityStaticTextRole]) return NSAccessibilityRoleDescription(NSAccessibilityStaticTextRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityImageRole]) return NSAccessibilityRoleDescription(NSAccessibilityImageRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityGroupRole]) return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityCheckBoxRole]) return NSAccessibilityRoleDescription(NSAccessibilityCheckBoxRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityRadioButtonRole]) return NSAccessibilityRoleDescription(NSAccessibilityRadioButtonRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityTextFieldRole]) return NSAccessibilityRoleDescription(NSAccessibilityTextFieldRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityTextAreaRole]) return NSAccessibilityRoleDescription(NSAccessibilityTextAreaRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityListRole]) return NSAccessibilityRoleDescription(NSAccessibilityListRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityTableRole]) return NSAccessibilityRoleDescription(NSAccessibilityTableRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityRowRole]) return NSAccessibilityRoleDescription(NSAccessibilityRowRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityColumnRole]) return NSAccessibilityRoleDescription(NSAccessibilityColumnRole, [self subrole]); if ([axRole isEqualToString:NSAccessibilityCellRole]) return NSAccessibilityRoleDescription(NSAccessibilityCellRole, [self subrole]); if ([axRole isEqualToString:@"AXWebArea"]) return AXWebAreaText(); if ([axRole isEqualToString:@"AXLink"]) return AXLinkText(); if ([axRole isEqualToString:@"AXListMarker"]) return AXListMarkerText(); if ([axRole isEqualToString:@"AXImageMap"]) return AXImageMapText(); if ([axRole isEqualToString:@"AXHeading"]) return AXHeadingText(); if ([axRole isEqualToString:(NSString*)kAXMenuBarItemRole] || [axRole isEqualToString:NSAccessibilityMenuRole]) return nil; if ([axRole isEqualToString:NSAccessibilityMenuButtonRole]) return NSAccessibilityRoleDescription(NSAccessibilityMenuButtonRole, [self subrole]); return NSAccessibilityRoleDescription(NSAccessibilityUnknownRole, nil);}// FIXME: split up this function in a better way. // suggestions: Use a hash table that maps attribute names to function calls,// or maybe pointers to member functions- (id)accessibilityAttributeValue:(NSString*)attributeName{ if (!m_object) return nil; m_object->updateBackingStore(); if ([attributeName isEqualToString: NSAccessibilityRoleAttribute]) return [self role]; if ([attributeName isEqualToString: NSAccessibilitySubroleAttribute]) return [self subrole]; if ([attributeName isEqualToString: NSAccessibilityRoleDescriptionAttribute]) return [self roleDescription]; if ([attributeName isEqualToString: NSAccessibilityParentAttribute]) { if (m_object->isAccessibilityRenderObject()) { FrameView* fv = static_cast<AccessibilityRenderObject*>(m_object)->frameViewIfRenderView(); if (fv) return fv->platformWidget(); } return m_object->parentObjectUnignored()->wrapper(); } if ([attributeName isEqualToString: NSAccessibilityChildrenAttribute]) { if (m_object->children().isEmpty()) { NSArray* children = [self renderWidgetChildren]; if (children != nil) return children; } return convertToNSArray(m_object->children()); } if ([attributeName isEqualToString: NSAccessibilitySelectedChildrenAttribute]) { if (m_object->isListBox()) { AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy; m_object->selectedChildren(selectedChildrenCopy); return convertToNSArray(selectedChildrenCopy); } return nil; } if ([attributeName isEqualToString: NSAccessibilityVisibleChildrenAttribute]) { if (m_object->isListBox()) { AccessibilityObject::AccessibilityChildrenVector visibleChildrenCopy; m_object->visibleChildren(visibleChildrenCopy); return convertToNSArray(visibleChildrenCopy); } else if (m_object->isList()) return [self accessibilityAttributeValue:NSAccessibilityChildrenAttribute]; return nil; } if (m_object->isWebArea()) { if ([attributeName isEqualToString: @"AXLinkUIElements"]) { AccessibilityObject::AccessibilityChildrenVector links; static_cast<AccessibilityRenderObject*>(m_object)->getDocumentLinks(links); return convertToNSArray(links); } if ([attributeName isEqualToString: @"AXLoaded"]) return [NSNumber numberWithBool: m_object->isLoaded()]; if ([attributeName isEqualToString: @"AXLayoutCount"]) return [NSNumber numberWithInt: m_object->layoutCount()]; } if (m_object->isTextControl()) { if ([attributeName isEqualToString: NSAccessibilityNumberOfCharactersAttribute]) { int length = m_object->textLength(); if (length < 0) return nil; return [NSNumber numberWithUnsignedInt:length]; } if ([attributeName isEqualToString: NSAccessibilitySelectedTextAttribute]) { String selectedText = m_object->selectedText(); if (selectedText.isNull()) return nil; return (NSString*)selectedText; } if ([attributeName isEqualToString: NSAccessibilitySelectedTextRangeAttribute]) { PlainTextRange textRange = m_object->selectedTextRange(); if (textRange.isNull()) return nil; return [NSValue valueWithRange:NSMakeRange(textRange.start, textRange.length)]; } // TODO: Get actual visible range. <rdar://problem/4712101> if ([attributeName isEqualToString: NSAccessibilityVisibleCharacterRangeAttribute]) return m_object->isPasswordField() ? nil : [NSValue valueWithRange: NSMakeRange(0, m_object->textLength())]; if ([attributeName isEqualToString: NSAccessibilityInsertionPointLineNumberAttribute]) { // if selectionEnd > 0, then there is selected text and this question should not be answered if (m_object->isPasswordField() || m_object->selectionEnd() > 0) return nil; int lineNumber = m_object->lineForPosition(m_object->visiblePositionForIndex(m_object->selectionStart(), true)); if (lineNumber < 0) return nil; return [NSNumber numberWithInt:lineNumber]; } } if ([attributeName isEqualToString: NSAccessibilityURLAttribute]) { KURL url = m_object->url(); if (url.isNull()) return nil; return (NSURL*)url; } if ([attributeName isEqualToString: @"AXVisited"]) return [NSNumber numberWithBool: m_object->isVisited()]; if ([attributeName isEqualToString: NSAccessibilityTitleAttribute]) { if (m_object->isAttachment()) { if ([[[self attachmentView] accessibilityAttributeNames] containsObject:NSAccessibilityTitleAttribute]) return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityTitleAttribute]; } return m_object->title(); } if ([attributeName isEqualToString: NSAccessibilityDescriptionAttribute]) { if (m_object->isAttachment()) { if ([[[self attachmentView] accessibilityAttributeNames] containsObject:NSAccessibilityDescriptionAttribute]) return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityDescriptionAttribute];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -