[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