📄 kwqaccobject.cpp
字号:
NodeImpl* e = m_renderer->element();
DocumentImpl* d = m_renderer->document();
if (e && d) {
KHTMLPart* p = d->part();
if (p) {
Range r(p->document());
if (m_renderer->isText()) {
r.setStartBefore(e);
r.setEndAfter(e);
return p->text(r).getNSString();
}
if (e->firstChild()) {
r.setStartBefore(e->firstChild());
r.setEndAfter(e->lastChild());
return p->text(r).getNSString();
}
}
}
return nil;
}
-(NSString*)value
{
if (!m_renderer || m_areaElement)
return nil;
if (m_renderer->isText())
return [self textUnderElement];
if (m_renderer->isListMarker())
return static_cast<RenderListMarker*>(m_renderer)->text().getNSString();
// FIXME: We might need to implement a value here for more types
// FIXME: It would be better not to advertise a value at all for the types for which we don't implement one;
// this would require subclassing or making accessibilityAttributeNames do something other than return a
// single static array.
return nil;
}
-(NSString*)title
{
if (!m_renderer || m_areaElement)
return nil;
if (m_renderer->isImage()) {
if (m_renderer->element() && m_renderer->element()->isHTMLElement()) {
QString alt = static_cast<ElementImpl*>(m_renderer->element())->getAttribute(ATTR_ALT).string();
return !alt.isEmpty() ? alt.getNSString() : nil;
}
}
else if (m_renderer->element() && m_renderer->element()->isHTMLElement() &&
Node(m_renderer->element()).elementId() == ID_BUTTON)
return [self textUnderElement];
else if (m_renderer->element() && m_renderer->element()->hasAnchor())
return [self textUnderElement];
return nil;
}
static QRect boundingBoxRect(RenderObject* obj)
{
QRect rect(0,0,0,0);
if (obj) {
if (obj->isInlineContinuation())
obj = obj->element()->renderer();
QValueList<QRect> rects;
int x = 0, y = 0;
obj->absolutePosition(x, y);
obj->absoluteRects(rects, x, y);
for (QValueList<QRect>::ConstIterator it = rects.begin(); it != rects.end(); ++it) {
QRect r = *it;
if (r.isValid()) {
if (rect.isEmpty())
rect = r;
else
rect.unite(r);
}
}
}
return rect;
}
-(NSValue*)position
{
QRect rect = m_areaElement ? m_areaElement->getRect(m_renderer) : boundingBoxRect(m_renderer);
// The Cocoa accessibility API wants the lower-left corner, not the upper-left, so we add in our height.
NSPoint point = NSMakePoint(rect.x(), rect.y() + rect.height());
if (m_renderer && m_renderer->canvas() && m_renderer->canvas()->view()) {
NSView* view = m_renderer->canvas()->view()->getDocumentView();
point = [[view window] convertBaseToScreen: [view convertPoint: point toView:nil]];
}
return [NSValue valueWithPoint: point];
}
-(NSValue*)size
{
QRect rect = m_areaElement ? m_areaElement->getRect(m_renderer) : boundingBoxRect(m_renderer);
return [NSValue valueWithSize: NSMakeSize(rect.width(), rect.height())];
}
-(BOOL)accessibilityIsIgnored
{
if (!m_renderer || m_renderer->style()->visibility() != khtml::VISIBLE)
return YES;
if (m_renderer->isText())
return m_renderer->isBR() || !static_cast<RenderText*>(m_renderer)->firstTextBox();
if (m_areaElement || (m_renderer->element() && m_renderer->element()->hasAnchor()))
return NO;
if (m_renderer->isBlockFlow() && m_renderer->childrenInline())
return !static_cast<RenderBlock*>(m_renderer)->firstLineBox();
return (!m_renderer->isListMarker() && !m_renderer->isCanvas() &&
!m_renderer->isImage() &&
!(m_renderer->element() && m_renderer->element()->isHTMLElement() &&
Node(m_renderer->element()).elementId() == ID_BUTTON));
}
- (NSArray *)accessibilityAttributeNames
{
static NSArray* attributes = nil;
static NSArray* anchorAttrs = nil;
static NSArray* webAreaAttrs = nil;
if (attributes == nil) {
attributes = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
NSAccessibilityRoleDescriptionAttribute,
NSAccessibilityChildrenAttribute,
NSAccessibilityHelpAttribute,
NSAccessibilityParentAttribute,
NSAccessibilityPositionAttribute,
NSAccessibilitySizeAttribute,
NSAccessibilityTitleAttribute,
NSAccessibilityValueAttribute,
NSAccessibilityFocusedAttribute,
NSAccessibilityEnabledAttribute,
NSAccessibilityWindowAttribute,
nil];
}
if (anchorAttrs == nil) {
anchorAttrs = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
NSAccessibilityRoleDescriptionAttribute,
NSAccessibilityChildrenAttribute,
NSAccessibilityHelpAttribute,
NSAccessibilityParentAttribute,
NSAccessibilityPositionAttribute,
NSAccessibilitySizeAttribute,
NSAccessibilityTitleAttribute,
NSAccessibilityValueAttribute,
NSAccessibilityFocusedAttribute,
NSAccessibilityEnabledAttribute,
NSAccessibilityWindowAttribute,
@"AXURL",
nil];
}
if (webAreaAttrs == nil) {
webAreaAttrs = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
NSAccessibilityRoleDescriptionAttribute,
NSAccessibilityChildrenAttribute,
NSAccessibilityHelpAttribute,
NSAccessibilityParentAttribute,
NSAccessibilityPositionAttribute,
NSAccessibilitySizeAttribute,
NSAccessibilityTitleAttribute,
NSAccessibilityValueAttribute,
NSAccessibilityFocusedAttribute,
NSAccessibilityEnabledAttribute,
NSAccessibilityWindowAttribute,
@"AXLinkUIElements",
@"AXLoaded",
@"AXLayoutCount",
nil];
}
if (m_renderer->isCanvas())
return webAreaAttrs;
if (m_areaElement || (!m_renderer->isImage() && m_renderer->element() && m_renderer->element()->hasAnchor()))
return anchorAttrs;
return attributes;
}
- (NSArray*)accessibilityActionNames
{
static NSArray* actions = nil;
if ([self anchorElement]) {
if (actions == nil)
actions = [[NSArray alloc] initWithObjects: NSAccessibilityPressAction, nil];
return actions;
}
return nil;
}
- (NSString *)accessibilityActionDescription:(NSString *)action
{
// We only have the one action (press).
return UI_STRING("press link", "accessibility action description");
}
- (void)accessibilityPerformAction:(NSString *)action
{
// We only have the one action (press).
// Locate the anchor element. If it doesn't exist, just bail.
HTMLAnchorElementImpl* anchorElt = [self anchorElement];
if (!anchorElt) return;
anchorElt->click();
}
- (BOOL)accessibilityIsAttributeSettable:(NSString*)attributeName
{
return NO;
}
- (id)accessibilityAttributeValue:(NSString *)attributeName
{
if (!m_renderer)
return nil;
if ([attributeName isEqualToString: NSAccessibilityRoleAttribute])
return [self role];
if ([attributeName isEqualToString: NSAccessibilityRoleDescriptionAttribute])
return [self roleDescription];
if ([attributeName isEqualToString: NSAccessibilityParentAttribute]) {
if (m_renderer->isCanvas())
return m_renderer->canvas()->view()->getView();
return [self parentObjectUnignored];
}
if ([attributeName isEqualToString: NSAccessibilityChildrenAttribute]) {
if (!m_children) {
m_children = [NSMutableArray arrayWithCapacity: 8];
[m_children retain];
[self addChildrenToArray: m_children];
}
return m_children;
}
if (m_renderer->isCanvas()) {
if ([attributeName isEqualToString: @"AXLinkUIElements"]) {
NSMutableArray* links = [NSMutableArray arrayWithCapacity: 32];
HTMLCollection coll(m_renderer->document(), HTMLCollectionImpl::DOC_LINKS);
if (coll.isNull())
return links;
Node curr = coll.firstItem();
while (!curr.isNull()) {
RenderObject* obj = curr.handle()->renderer();
if (obj)
[links addObject: obj->document()->getOrCreateAccObjectCache()->accObject(obj)];
curr = coll.nextItem();
}
return links;
}
else if ([attributeName isEqualToString: @"AXLoaded"])
return [NSNumber numberWithBool: (!m_renderer->document()->tokenizer())];
else if ([attributeName isEqualToString: @"AXLayoutCount"])
return [NSNumber numberWithInt: (static_cast<RenderCanvas*>(m_renderer)->view()->layoutCount())];
}
if ([attributeName isEqualToString: @"AXURL"] &&
(m_areaElement || (!m_renderer->isImage() && m_renderer->element() && m_renderer->element()->hasAnchor()))) {
HTMLAnchorElementImpl* anchor = [self anchorElement];
if (anchor) {
QString s = anchor->getAttribute(ATTR_HREF).string();
if (!s.isNull()) {
s = anchor->getDocument()->completeURL(s);
return s.getNSString();
}
}
}
if ([attributeName isEqualToString: NSAccessibilityTitleAttribute])
return [self title];
if ([attributeName isEqualToString: NSAccessibilityValueAttribute])
return [self value];
if ([attributeName isEqualToString: NSAccessibilityHelpAttribute])
return [self helpText];
if ([attributeName isEqualToString: NSAccessibilityFocusedAttribute])
return [NSNumber numberWithBool: (m_renderer->element() && m_renderer->document()->focusNode() == m_renderer->element())];
if ([attributeName isEqualToString: NSAccessibilityEnabledAttribute])
return [NSNumber numberWithBool: YES];
if ([attributeName isEqualToString: NSAccessibilitySizeAttribute])
return [self size];
if ([attributeName isEqualToString: NSAccessibilityPositionAttribute])
return [self position];
if ([attributeName isEqualToString: NSAccessibilityWindowAttribute])
return [m_renderer->canvas()->view()->getView() window];
return nil;
}
- (id)accessibilityHitTest:(NSPoint)point
{
if (!m_renderer)
return self;
RenderObject::NodeInfo nodeInfo(true, true);
m_renderer->layer()->nodeAtPoint(nodeInfo, (int)point.x, (int)point.y);
if (!nodeInfo.innerNode())
return self;
RenderObject* obj = nodeInfo.innerNode()->renderer();
if (!obj)
return self;
return obj->document()->getOrCreateAccObjectCache()->accObject(obj);
}
- (void)childrenChanged
{
[self clearChildren];
if ([self accessibilityIsIgnored])
[[self parentObject] childrenChanged];
}
- (void)clearChildren
{
[m_children release];
m_children = nil;
}
@end
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -