[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
hyatt
hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:37:52 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 7dd1e2d60b4ccbdee1060b98fa31c48584726e2a
Author: hyatt <hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Apr 29 23:08:13 2004 +0000
Implement image maps for accessibility.
Reviewed by darin
* khtml/html/html_imageimpl.cpp:
(HTMLAreaElementImpl::getRect):
* khtml/html/html_imageimpl.h:
* khtml/rendering/render_image.cpp:
(RenderImage::imageMap):
(RenderImage::nodeAtPoint):
* khtml/rendering/render_image.h:
* kwq/KWQAccObject.h:
* kwq/KWQAccObject.mm:
(-[KWQAccObject initWithRenderer:]):
(-[KWQAccObject anchorElement]):
(-[KWQAccObject parentObject]):
(-[KWQAccObject parentObjectUnignored]):
(-[KWQAccObject addChildrenToArray:]):
(-[KWQAccObject role]):
(-[KWQAccObject helpText]):
(-[KWQAccObject value]):
(-[KWQAccObject title]):
(-[KWQAccObject position]):
(-[KWQAccObject size]):
(-[KWQAccObject accessibilityIsIgnored]):
(-[KWQAccObject accessibilityAttributeNames]):
(-[KWQAccObject accessibilityAttributeValue:]):
* kwq/KWQRegion.mm:
(QRegion::boundingRect):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@6522 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index ca75ac8..3730fba 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,35 @@
+2004-04-29 David Hyatt <hyatt at apple.com>
+
+ Implement image maps for accessibility.
+
+ Reviewed by darin
+
+ * khtml/html/html_imageimpl.cpp:
+ (HTMLAreaElementImpl::getRect):
+ * khtml/html/html_imageimpl.h:
+ * khtml/rendering/render_image.cpp:
+ (RenderImage::imageMap):
+ (RenderImage::nodeAtPoint):
+ * khtml/rendering/render_image.h:
+ * kwq/KWQAccObject.h:
+ * kwq/KWQAccObject.mm:
+ (-[KWQAccObject initWithRenderer:]):
+ (-[KWQAccObject anchorElement]):
+ (-[KWQAccObject parentObject]):
+ (-[KWQAccObject parentObjectUnignored]):
+ (-[KWQAccObject addChildrenToArray:]):
+ (-[KWQAccObject role]):
+ (-[KWQAccObject helpText]):
+ (-[KWQAccObject value]):
+ (-[KWQAccObject title]):
+ (-[KWQAccObject position]):
+ (-[KWQAccObject size]):
+ (-[KWQAccObject accessibilityIsIgnored]):
+ (-[KWQAccObject accessibilityAttributeNames]):
+ (-[KWQAccObject accessibilityAttributeValue:]):
+ * kwq/KWQRegion.mm:
+ (QRegion::boundingRect):
+
2004-04-29 Chris Blumenberg <cblu at apple.com>
Fixed:
diff --git a/WebCore/khtml/html/html_imageimpl.cpp b/WebCore/khtml/html/html_imageimpl.cpp
index 8424f96..ef34931 100644
--- a/WebCore/khtml/html/html_imageimpl.cpp
+++ b/WebCore/khtml/html/html_imageimpl.cpp
@@ -454,13 +454,10 @@ bool HTMLAreaElementImpl::mapMouseEvent(int x_, int y_, int width_, int height_,
return inside;
}
-QRect HTMLAreaElementImpl::getRect() const
+QRect HTMLAreaElementImpl::getRect(RenderObject* obj) const
{
- if (parentNode()->renderer()==0)
- return QRect();
int dx, dy;
- if (!parentNode()->renderer()->absolutePosition(dx, dy))
- return QRect();
+ obj->absolutePosition(dx, dy);
QRegion region = getRegion(lastw,lasth);
region.translate(dx, dy);
return region.boundingRect();
diff --git a/WebCore/khtml/html/html_imageimpl.h b/WebCore/khtml/html/html_imageimpl.h
index 4eb0d4b..472e5bb 100644
--- a/WebCore/khtml/html/html_imageimpl.h
+++ b/WebCore/khtml/html/html_imageimpl.h
@@ -97,7 +97,7 @@ public:
bool mapMouseEvent(int x_, int y_, int width_, int height_,
khtml::RenderObject::NodeInfo& info);
- virtual QRect getRect() const;
+ virtual QRect getRect(khtml::RenderObject* obj) const;
protected:
QRegion getRegion(int width_, int height) const;
diff --git a/WebCore/khtml/rendering/render_image.cpp b/WebCore/khtml/rendering/render_image.cpp
index 1d6ac30..383a158 100644
--- a/WebCore/khtml/rendering/render_image.cpp
+++ b/WebCore/khtml/rendering/render_image.cpp
@@ -571,6 +571,12 @@ void RenderImage::detach()
RenderReplaced::detach();
}
+HTMLMapElementImpl* RenderImage::imageMap()
+{
+ HTMLImageElementImpl* i = element()->id() == ID_IMG ? static_cast<HTMLImageElementImpl*>(element()) : 0;
+ return i ? i->getDocument()->getImageMap(i->imageMap()) : 0;
+}
+
bool RenderImage::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty,
HitTestAction hitTestAction, bool inside)
{
@@ -580,9 +586,8 @@ bool RenderImage::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty,
int tx = _tx + m_x;
int ty = _ty + m_y;
- HTMLImageElementImpl* i = element()->id() == ID_IMG ? static_cast<HTMLImageElementImpl*>(element()) : 0;
- HTMLMapElementImpl* map;
- if (i && (map = i->getDocument()->getImageMap(i->imageMap()))) {
+ HTMLMapElementImpl* map = imageMap();
+ if (map) {
// we're a client side image map
inside = map->mapMouseEvent(_x - tx, _y - ty, contentWidth(), contentHeight(), info);
info.setInnerNonSharedNode(element());
diff --git a/WebCore/khtml/rendering/render_image.h b/WebCore/khtml/rendering/render_image.h
index 2482474..4eb33c4 100644
--- a/WebCore/khtml/rendering/render_image.h
+++ b/WebCore/khtml/rendering/render_image.h
@@ -31,6 +31,10 @@
#include <qmap.h>
#include <qpixmap.h>
+namespace DOM {
+ class HTMLMapElementImpl;
+}
+
namespace khtml {
class DocLoader;
@@ -80,6 +84,8 @@ public:
bool isDisplayingError() const { return berrorPic; }
+ DOM::HTMLMapElementImpl* imageMap();
+
private:
bool isWidthSpecified() const;
bool isHeightSpecified() const;
diff --git a/WebCore/kwq/KWQAccObject.h b/WebCore/kwq/KWQAccObject.h
index b852b12..5fa646f 100644
--- a/WebCore/kwq/KWQAccObject.h
+++ b/WebCore/kwq/KWQAccObject.h
@@ -25,6 +25,10 @@
#import <Foundation/Foundation.h>
+namespace DOM {
+ class HTMLAreaElementImpl;
+}
+
namespace khtml {
class RenderObject;
}
@@ -33,6 +37,7 @@ namespace khtml {
{
khtml::RenderObject* m_renderer;
id m_data;
+ DOM::HTMLAreaElementImpl* m_areaElement;
NSMutableArray* m_children;
}
diff --git a/WebCore/kwq/KWQAccObject.mm b/WebCore/kwq/KWQAccObject.mm
index 333cd66..265abe3 100644
--- a/WebCore/kwq/KWQAccObject.mm
+++ b/WebCore/kwq/KWQAccObject.mm
@@ -31,6 +31,7 @@
#import "dom_docimpl.h"
#import "dom_elementimpl.h"
#import "html_inlineimpl.h"
+#import "html_imageimpl.h"
#import "dom_string.h"
#import "dom2_range.h"
#import "htmlattrs.h"
@@ -39,16 +40,19 @@
#import "khtml_part.h"
#import "render_canvas.h"
#import "render_object.h"
-#import "render_replaced.h"
+#import "render_image.h"
#import "render_list.h"
#import "render_style.h"
#import "render_text.h"
#import "kjs_html.h"
#import "html_miscimpl.h"
+#import "qptrstack.h"
using DOM::DocumentImpl;
using DOM::ElementImpl;
using DOM::HTMLAnchorElementImpl;
+using DOM::HTMLMapElementImpl;
+using DOM::HTMLAreaElementImpl;
using DOM::HTMLCollection;
using DOM::HTMLCollectionImpl;
using DOM::Node;
@@ -62,6 +66,7 @@ using khtml::RenderCanvas;
using khtml::RenderText;
using khtml::RenderBlock;
using khtml::RenderListMarker;
+using khtml::RenderImage;
// FIXME: This will eventually need to really localize.
#define UI_STRING(string, comment) ((NSString *)[NSString stringWithUTF8String:(string)])
@@ -71,6 +76,7 @@ using khtml::RenderListMarker;
{
[super init];
m_renderer = renderer;
+ m_areaElement = 0;
return self;
}
@@ -104,6 +110,9 @@ using khtml::RenderListMarker;
-(HTMLAnchorElementImpl*)anchorElement
{
+ if (m_areaElement)
+ return m_areaElement;
+
RenderObject* currRenderer;
for (currRenderer = m_renderer; currRenderer && !currRenderer->element(); currRenderer = currRenderer->parent())
if (currRenderer->continuation())
@@ -114,7 +123,7 @@ using khtml::RenderListMarker;
NodeImpl* elt = currRenderer->element();
for ( ; elt; elt = elt->parentNode()) {
- if (elt->hasAnchor())
+ if (elt->hasAnchor() && elt->renderer() && !elt->renderer()->isImage())
return static_cast<HTMLAnchorElementImpl*>(elt);
}
@@ -151,6 +160,9 @@ using khtml::RenderListMarker;
-(KWQAccObject*)parentObject
{
+ if (m_areaElement)
+ return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer);
+
if (!m_renderer || !m_renderer->parent())
return nil;
return m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->parent());
@@ -158,9 +170,7 @@ using khtml::RenderListMarker;
-(KWQAccObject*)parentObjectUnignored
{
- if (!m_renderer || !m_renderer->parent())
- return nil;
- KWQAccObject* obj = m_renderer->document()->getOrCreateAccObjectCache()->accObject(m_renderer->parent());
+ KWQAccObject* obj = [self parentObject];
if ([obj accessibilityIsIgnored])
return [obj parentObjectUnignored];
else
@@ -188,6 +198,35 @@ using khtml::RenderListMarker;
else
[array addObject: obj];
}
+
+ if (m_renderer->isImage() && !m_areaElement) {
+ HTMLMapElementImpl* map = static_cast<RenderImage*>(m_renderer)->imageMap();
+ if (map) {
+ // Need to add the <area> elements as individual accessibility objects.
+ QPtrStack<NodeImpl> nodeStack;
+ NodeImpl *current = map->firstChild();
+ while (1) {
+ if (!current) {
+ if(nodeStack.isEmpty()) break;
+ current = nodeStack.pop();
+ current = current->nextSibling();
+ continue;
+ }
+ if (current->hasAnchor()) {
+ KWQAccObject* obj = [[[KWQAccObject alloc] initWithRenderer: m_renderer] autorelease];
+ obj->m_areaElement = static_cast<HTMLAreaElementImpl*>(current);
+ [array addObject: obj];
+ }
+ NodeImpl *child = current->firstChild();
+ if (child) {
+ nodeStack.push(current);
+ current = child;
+ }
+ else
+ current = current->nextSibling();
+ }
+ }
+ }
}
-(NSString*)role
@@ -195,8 +234,13 @@ using khtml::RenderListMarker;
if (!m_renderer)
return NSAccessibilityUnknownRole;
- if (m_renderer->element() && m_renderer->element()->hasAnchor())
+ if (m_areaElement)
+ return @"AXLink";
+ if (m_renderer->element() && m_renderer->element()->hasAnchor()) {
+ if (m_renderer->isImage())
+ return @"AXImageMap";
return @"AXLink";
+ }
if (m_renderer->isListMarker())
return @"AXListMarker";
if (m_renderer->element() && m_renderer->element()->isHTMLElement() &&
@@ -205,7 +249,7 @@ using khtml::RenderListMarker;
if (m_renderer->isText())
return NSAccessibilityStaticTextRole;
if (m_renderer->isImage())
- return NSAccessibilityImageRole;
+ return NSAccessibilityImageRole;
if (m_renderer->isCanvas())
return @"AXWebArea";
if (m_renderer->isBlockFlow())
@@ -253,6 +297,12 @@ using khtml::RenderListMarker;
if (!m_renderer)
return nil;
+ if (m_areaElement) {
+ QString title = static_cast<ElementImpl*>(m_areaElement)->getAttribute(ATTR_TITLE).string();
+ if (!title.isEmpty())
+ return title.getNSString();
+ }
+
for (RenderObject* curr = m_renderer; curr; curr = curr->parent()) {
if (curr->element() && curr->element()->isHTMLElement()) {
QString title = static_cast<ElementImpl*>(curr->element())->getAttribute(ATTR_TITLE).string();
@@ -293,7 +343,7 @@ using khtml::RenderListMarker;
-(NSString*)value
{
- if (!m_renderer)
+ if (!m_renderer || m_areaElement)
return nil;
if (m_renderer->isText())
@@ -311,7 +361,7 @@ using khtml::RenderListMarker;
-(NSString*)title
{
- if (!m_renderer)
+ if (!m_renderer || m_areaElement)
return nil;
if (m_renderer->isImage()) {
@@ -354,7 +404,7 @@ static QRect boundingBoxRect(RenderObject* obj)
-(NSValue*)position
{
- QRect rect = boundingBoxRect(m_renderer);
+ 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());
@@ -367,7 +417,7 @@ static QRect boundingBoxRect(RenderObject* obj)
-(NSValue*)size
{
- QRect rect = boundingBoxRect(m_renderer);
+ QRect rect = m_areaElement ? m_areaElement->getRect(m_renderer) : boundingBoxRect(m_renderer);
return [NSValue valueWithSize: NSMakeSize(rect.width(), rect.height())];
}
@@ -379,7 +429,7 @@ static QRect boundingBoxRect(RenderObject* obj)
if (m_renderer->isText())
return m_renderer->isBR() || !static_cast<RenderText*>(m_renderer)->firstTextBox();
- if (m_renderer->element() && m_renderer->element()->hasAnchor())
+ if (m_areaElement || (m_renderer->element() && m_renderer->element()->hasAnchor()))
return NO;
if (m_renderer->isBlockFlow() && m_renderer->childrenInline())
@@ -446,7 +496,7 @@ static QRect boundingBoxRect(RenderObject* obj)
if (m_renderer->isCanvas())
return webAreaAttrs;
- if (m_renderer->element() && m_renderer->element()->hasAnchor())
+ if (m_areaElement || (!m_renderer->isImage() && m_renderer->element() && m_renderer->element()->hasAnchor()))
return anchorAttrs;
return attributes;
}
@@ -523,8 +573,8 @@ static QRect boundingBoxRect(RenderObject* obj)
return links;
}
- if ([attributeName isEqualToString: @"AXURL"] && m_renderer->element() &&
- m_renderer->element()->hasAnchor()) {
+ 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();
diff --git a/WebCore/kwq/KWQRegion.mm b/WebCore/kwq/KWQRegion.mm
index e31da9a..a6da16b 100644
--- a/WebCore/kwq/KWQRegion.mm
+++ b/WebCore/kwq/KWQRegion.mm
@@ -89,5 +89,5 @@ void QRegion::translate(int deltaX, int deltaY)
QRect QRegion::boundingRect() const
{
- return path ? QRect() : QRect([path bounds]);
+ return path ? QRect([path bounds]) : QRect();
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list